1 /* src/vmcore/class.c - class related functions
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: class.c 8339 2007-08-17 21:21:51Z twisti $
41 #include "mm/memory.h"
43 #include "native/llni.h"
45 #include "threads/lock-common.h"
47 #include "toolbox/logging.h"
50 #include "vm/builtin.h"
51 #include "vm/exceptions.h"
52 #include "vm/global.h"
53 #include "vm/resolve.h"
55 #include "vm/jit/asmpart.h"
57 #include "vmcore/class.h"
58 #include "vmcore/classcache.h"
59 #include "vmcore/linker.h"
60 #include "vmcore/loader.h"
61 #include "vmcore/options.h"
63 #if defined(ENABLE_STATISTICS)
64 # include "vmcore/statistics.h"
67 #include "vmcore/suck.h"
68 #include "vmcore/utf8.h"
71 /* global variables ***********************************************************/
73 /* frequently used classes ****************************************************/
75 /* important system classes */
77 classinfo *class_java_lang_Object;
78 classinfo *class_java_lang_Class;
79 classinfo *class_java_lang_ClassLoader;
80 classinfo *class_java_lang_Cloneable;
81 classinfo *class_java_lang_SecurityManager;
82 classinfo *class_java_lang_String;
83 classinfo *class_java_lang_System;
84 classinfo *class_java_lang_Thread;
85 classinfo *class_java_lang_ThreadGroup;
86 classinfo *class_java_lang_VMSystem;
87 classinfo *class_java_lang_VMThread;
88 classinfo *class_java_io_Serializable;
90 #if defined(WITH_CLASSPATH_SUN)
91 classinfo *class_sun_reflect_MagicAccessorImpl;
94 /* system exception classes required in cacao */
96 classinfo *class_java_lang_Throwable;
97 classinfo *class_java_lang_Error;
98 classinfo *class_java_lang_LinkageError;
99 classinfo *class_java_lang_NoClassDefFoundError;
100 classinfo *class_java_lang_OutOfMemoryError;
101 classinfo *class_java_lang_VirtualMachineError;
103 #if defined(WITH_CLASSPATH_GNU)
104 classinfo *class_java_lang_VMThrowable;
107 classinfo *class_java_lang_Exception;
108 classinfo *class_java_lang_ClassCastException;
109 classinfo *class_java_lang_ClassNotFoundException;
111 #if defined(ENABLE_JAVASE)
112 classinfo *class_java_lang_Void;
114 classinfo *class_java_lang_Boolean;
115 classinfo *class_java_lang_Byte;
116 classinfo *class_java_lang_Character;
117 classinfo *class_java_lang_Short;
118 classinfo *class_java_lang_Integer;
119 classinfo *class_java_lang_Long;
120 classinfo *class_java_lang_Float;
121 classinfo *class_java_lang_Double;
124 /* some runtime exception */
126 classinfo *class_java_lang_NullPointerException;
129 /* some classes which may be used more often */
131 #if defined(ENABLE_JAVASE)
132 classinfo *class_java_lang_StackTraceElement;
133 classinfo *class_java_lang_reflect_Constructor;
134 classinfo *class_java_lang_reflect_Field;
135 classinfo *class_java_lang_reflect_Method;
136 classinfo *class_java_security_PrivilegedAction;
137 classinfo *class_java_util_Vector;
139 classinfo *arrayclass_java_lang_Object;
141 #if defined(ENABLE_ANNOTATIONS)
142 classinfo *class_sun_reflect_ConstantPool;
143 classinfo *class_sun_reflect_annotation_AnnotationParser;
148 /* pseudo classes for the typechecker */
150 classinfo *pseudo_class_Arraystub;
151 classinfo *pseudo_class_Null;
152 classinfo *pseudo_class_New;
155 /* class_set_packagename *******************************************************
157 Derive the package name from the class name and store it in the struct.
159 *******************************************************************************/
161 void class_set_packagename(classinfo *c)
163 char *p = UTF_END(c->name) - 1;
164 char *start = c->name->text;
166 /* set the package name */
167 /* classes in the unnamed package keep packagename == NULL */
169 if (c->name->text[0] == '[') {
170 /* set packagename of arrays to the element's package */
172 for (; *start == '['; start++);
174 /* skip the 'L' in arrays of references */
178 for (; (p > start) && (*p != '/'); --p);
180 c->packagename = utf_new(start, p - start);
183 for (; (p > start) && (*p != '/'); --p);
185 c->packagename = utf_new(start, p - start);
190 /* class_create_classinfo ******************************************************
192 Create a new classinfo struct. The class name is set to the given utf *,
193 most other fields are initialized to zero.
195 Note: classname may be NULL. In this case a not-yet-named classinfo is
196 created. The name must be filled in later and class_set_packagename
197 must be called after that.
199 *******************************************************************************/
201 classinfo *class_create_classinfo(utf *classname)
205 #if defined(ENABLE_STATISTICS)
207 size_classinfo += sizeof(classinfo);
210 /* we use a safe name for temporarily unnamed classes */
212 if (classname == NULL)
213 classname = utf_not_named_yet;
217 log_message_utf("Creating class: ", classname);
220 /* GCNEW_UNCOLLECTABLE clears the allocated memory */
222 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
223 /*c=NEW(classinfo);*/
226 /* Set the header.vftbl of all loaded classes to the one of
227 java.lang.Class, so Java code can use a class as object. */
229 if (class_java_lang_Class != NULL)
230 if (class_java_lang_Class->vftbl != NULL)
231 c->object.header.vftbl = class_java_lang_Class->vftbl;
233 #if defined(ENABLE_JAVASE)
234 /* check if the class is a reference class and flag it */
236 if (classname == utf_java_lang_ref_SoftReference) {
237 c->flags |= ACC_CLASS_REFERENCE_SOFT;
239 else if (classname == utf_java_lang_ref_WeakReference) {
240 c->flags |= ACC_CLASS_REFERENCE_WEAK;
242 else if (classname == utf_java_lang_ref_PhantomReference) {
243 c->flags |= ACC_CLASS_REFERENCE_PHANTOM;
247 if (classname != utf_not_named_yet)
248 class_set_packagename(c);
250 LOCK_INIT_OBJECT_LOCK(&c->object.header);
256 /* class_postset_header_vftbl **************************************************
258 Set the header.vftbl of all classes created before java.lang.Class
259 was linked. This is necessary that Java code can use a class as
262 *******************************************************************************/
264 void class_postset_header_vftbl(void)
268 classcache_name_entry *nmen;
269 classcache_class_entry *clsen;
271 assert(class_java_lang_Class);
273 for (slot = 0; slot < hashtable_classcache.size; slot++) {
274 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
276 for (; nmen; nmen = nmen->hashlink) {
277 /* iterate over all class entries */
279 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
282 /* now set the the vftbl */
284 if (c->object.header.vftbl == NULL)
285 c->object.header.vftbl = class_java_lang_Class->vftbl;
291 /* class_define ****************************************************************
293 Calls the loader and defines a class in the VM.
295 *******************************************************************************/
297 classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data)
304 /* check if this class has already been defined */
306 c = classcache_lookup_defined_or_initiated(cl, name);
309 exceptions_throw_linkageerror("duplicate class definition: ", c);
314 /* create a new classinfo struct */
316 c = class_create_classinfo(name);
318 #if defined(ENABLE_STATISTICS)
321 if (opt_getloadingtime)
325 /* build a classbuffer with the given data */
327 cb = NEW(classbuffer);
334 /* preset the defining classloader */
338 /* load the class from this buffer */
340 r = load_class_from_classbuffer(cb);
344 FREE(cb, classbuffer);
346 #if defined(ENABLE_STATISTICS)
349 if (opt_getloadingtime)
354 /* If return value is NULL, we had a problem and the class is
355 not loaded. Now free the allocated memory, otherwise we
356 could run into a DOS. */
363 /* Store the newly defined class in the class cache. This call
364 also checks whether a class of the same name has already been
365 defined by the same defining loader, and if so, replaces the
366 newly created class by the one defined earlier. */
368 /* Important: The classinfo given to classcache_store must be
369 fully prepared because another thread may return
370 this pointer after the lookup at to top of this
371 function directly after the class cache lock has
374 c = classcache_store(cl, c, true);
380 /* class_load_attribute_sourcefile *********************************************
382 SourceFile_attribute {
383 u2 attribute_name_index;
388 *******************************************************************************/
390 static bool class_load_attribute_sourcefile(classbuffer *cb)
401 /* check buffer size */
403 if (!suck_check_classbuffer_size(cb, 4 + 2))
406 /* check attribute length */
408 attribute_length = suck_u4(cb);
410 if (attribute_length != 2) {
411 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
415 /* there can be no more than one SourceFile attribute */
417 if (c->sourcefile != NULL) {
418 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
424 sourcefile_index = suck_u2(cb);
425 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
427 if (sourcefile == NULL)
430 /* store sourcefile */
432 c->sourcefile = sourcefile;
438 /* class_load_attribute_enclosingmethod ****************************************
440 EnclosingMethod_attribute {
441 u2 attribute_name_index;
447 *******************************************************************************/
449 #if defined(ENABLE_JAVASE)
450 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
456 classref_or_classinfo cr;
457 constant_nameandtype *cn;
463 /* check buffer size */
465 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
468 /* check attribute length */
470 attribute_length = suck_u4(cb);
472 if (attribute_length != 4) {
473 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
477 /* there can be no more than one EnclosingMethod attribute */
479 if (c->enclosingmethod != NULL) {
480 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
484 /* get class index */
486 class_index = suck_u2(cb);
487 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
489 /* get method index */
491 method_index = suck_u2(cb);
492 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
494 /* store info in classinfo */
496 c->enclosingclass.any = cr.any;
497 c->enclosingmethod = cn;
501 #endif /* defined(ENABLE_JAVASE) */
504 /* class_load_attributes *******************************************************
506 Read attributes from ClassFile.
509 u2 attribute_name_index;
511 u1 info[attribute_length];
514 InnerClasses_attribute {
515 u2 attribute_name_index;
519 *******************************************************************************/
521 bool class_load_attributes(classbuffer *cb)
524 uint16_t attributes_count;
525 uint16_t attribute_name_index;
527 innerclassinfo *info;
528 classref_or_classinfo inner;
529 classref_or_classinfo outer;
536 /* get attributes count */
538 if (!suck_check_classbuffer_size(cb, 2))
541 attributes_count = suck_u2(cb);
543 for (i = 0; i < attributes_count; i++) {
544 /* get attribute name */
546 if (!suck_check_classbuffer_size(cb, 2))
549 attribute_name_index = suck_u2(cb);
551 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
553 if (attribute_name == NULL)
556 if (attribute_name == utf_InnerClasses) {
559 if (c->innerclass != NULL) {
560 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
564 if (!suck_check_classbuffer_size(cb, 4 + 2))
567 /* skip attribute length */
570 /* number of records */
571 c->innerclasscount = suck_u2(cb);
573 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
576 /* allocate memory for innerclass structure */
577 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
579 for (j = 0; j < c->innerclasscount; j++) {
580 /* The innerclass structure contains a class with an encoded
581 name, its defining scope, its simple name and a bitmask of
584 info = c->innerclass + j;
586 inner.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
587 outer.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
588 name = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
591 /* If the current inner-class is the currently loaded
592 class check for some special flags. */
594 if (inner.ref->name == c->name) {
595 /* If an inner-class is not a member, its
596 outer-class is NULL. */
598 if (outer.ref != NULL) {
599 c->flags |= ACC_CLASS_MEMBER;
601 /* A member class doesn't have an
602 EnclosingMethod attribute, so set the
603 enclosing-class to be the same as the
606 c->declaringclass = outer;
607 c->enclosingclass = outer;
610 /* If an inner-class is anonymous, its name is
614 c->flags |= ACC_CLASS_ANONYMOUS;
617 info->inner_class = inner;
618 info->outer_class = outer;
623 else if (attribute_name == utf_SourceFile) {
626 if (!class_load_attribute_sourcefile(cb))
629 #if defined(ENABLE_JAVASE)
630 else if (attribute_name == utf_EnclosingMethod) {
631 /* EnclosingMethod */
633 if (!class_load_attribute_enclosingmethod(cb))
636 else if (attribute_name == utf_Signature) {
639 if (!loader_load_attribute_signature(cb, &(c->signature)))
644 #if defined(ENABLE_ANNOTATIONS)
645 /* XXX We can't do a release with that enabled */
647 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
648 /* RuntimeVisibleAnnotations */
649 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
652 /* XXX RuntimeInvisibleAnnotations should only be loaded
653 * (or returned to Java) if some commandline options says so.
654 * Currently there is no such option available in cacao,
655 * therefore I load them allways (for testing purpose).
656 * Anyway, bytecode for RuntimeInvisibleAnnotations is only
657 * generated if you tell javac to do so. So in most cases
658 * there won't be any.
660 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
661 /* RuntimeInvisibleAnnotations */
662 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
668 /* unknown attribute */
670 if (!loader_skip_attribute_body(cb))
679 /* class_freepool **************************************************************
681 Frees all resources used by this classes Constant Pool.
683 *******************************************************************************/
685 static void class_freecpool(classinfo *c)
691 if (c->cptags && c->cpinfos) {
692 for (idx = 0; idx < c->cpcount; idx++) {
693 tag = c->cptags[idx];
694 info = c->cpinfos[idx];
698 case CONSTANT_Fieldref:
699 case CONSTANT_Methodref:
700 case CONSTANT_InterfaceMethodref:
701 FREE(info, constant_FMIref);
703 case CONSTANT_Integer:
704 FREE(info, constant_integer);
707 FREE(info, constant_float);
710 FREE(info, constant_long);
712 case CONSTANT_Double:
713 FREE(info, constant_double);
715 case CONSTANT_NameAndType:
716 FREE(info, constant_nameandtype);
724 MFREE(c->cptags, u1, c->cpcount);
727 MFREE(c->cpinfos, voidptr, c->cpcount);
731 /* class_getconstant ***********************************************************
733 Retrieves the value at position 'pos' of the constantpool of a
734 class. If the type of the value is other than 'ctype', an error is
737 *******************************************************************************/
739 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
741 /* check index and type of constantpool entry */
742 /* (pos == 0 is caught by type comparison) */
744 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
745 exceptions_throw_classformaterror(c, "Illegal constant pool index");
749 return c->cpinfos[pos];
753 /* innerclass_getconstant ******************************************************
755 Like class_getconstant, but if cptags is ZERO, null is returned.
757 *******************************************************************************/
759 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
761 /* invalid position in constantpool */
763 if (pos >= c->cpcount) {
764 exceptions_throw_classformaterror(c, "Illegal constant pool index");
768 /* constantpool entry of type 0 */
770 if (c->cptags[pos] == 0)
773 /* check type of constantpool entry */
775 if (c->cptags[pos] != ctype) {
776 exceptions_throw_classformaterror(c, "Illegal constant pool index");
780 return c->cpinfos[pos];
784 /* class_free ******************************************************************
786 Frees all resources used by the class.
788 *******************************************************************************/
790 void class_free(classinfo *c)
798 MFREE(c->interfaces, classinfo*, c->interfacescount);
801 for (i = 0; i < c->fieldscount; i++)
802 field_free(&(c->fields[i]));
803 #if defined(ENABLE_CACAO_GC)
804 MFREE(c->fields, fieldinfo, c->fieldscount);
809 for (i = 0; i < c->methodscount; i++)
810 method_free(&(c->methods[i]));
811 MFREE(c->methods, methodinfo, c->methodscount);
814 if ((v = c->vftbl) != NULL) {
816 mem_free(v->arraydesc,sizeof(arraydescriptor));
818 for (i = 0; i < v->interfacetablelength; i++) {
819 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
821 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
823 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
824 sizeof(methodptr*) * (v->interfacetablelength -
825 (v->interfacetablelength > 0));
826 v = (vftbl_t*) (((methodptr*) v) -
827 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
832 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
834 /* if (c->classvftbl)
835 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
839 #if defined(ENABLE_ANNOTATIONS)
840 annotation_bytearray_free(c->annotations);
842 annotation_bytearrays_free(c->method_annotations);
843 annotation_bytearrays_free(c->method_parameterannotations);
844 annotation_bytearrays_free(c->method_annotationdefaults);
846 annotation_bytearrays_free(c->field_annotations);
851 /* get_array_class *************************************************************
853 Returns the array class with the given name for the given
854 classloader, or NULL if an exception occurred.
856 Note: This function does eager loading.
858 *******************************************************************************/
860 static classinfo *get_array_class(utf *name,classloader *initloader,
861 classloader *defloader,bool link)
865 /* lookup this class in the classcache */
866 c = classcache_lookup(initloader,name);
868 c = classcache_lookup_defined(defloader,name);
871 /* we have to create it */
872 c = class_create_classinfo(name);
873 c = load_newly_created_array(c,initloader);
879 assert(c->state & CLASS_LOADED);
880 assert(c->classloader == defloader);
882 if (link && !(c->state & CLASS_LINKED))
886 assert(!link || (c->state & CLASS_LINKED));
892 /* class_array_of **************************************************************
894 Returns an array class with the given component class. The array
895 class is dynamically created if neccessary.
897 *******************************************************************************/
899 classinfo *class_array_of(classinfo *component, bool link)
908 cl = component->classloader;
910 dumpsize = dump_size();
912 /* Assemble the array class name */
913 namelen = component->name->blength;
915 if (component->name->text[0] == '[') {
916 /* the component is itself an array */
917 namebuf = DMNEW(char, namelen + 1);
919 MCOPY(namebuf + 1, component->name->text, char, namelen);
923 /* the component is a non-array class */
924 namebuf = DMNEW(char, namelen + 3);
927 MCOPY(namebuf + 2, component->name->text, char, namelen);
928 namebuf[2 + namelen] = ';';
932 u = utf_new(namebuf, namelen);
934 c = get_array_class(u, cl, cl, link);
936 dump_release(dumpsize);
942 /* class_multiarray_of *********************************************************
944 Returns an array class with the given dimension and element class.
945 The array class is dynamically created if neccessary.
947 *******************************************************************************/
949 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
956 dumpsize = dump_size();
959 log_text("Invalid array dimension requested");
963 /* Assemble the array class name */
964 namelen = element->name->blength;
966 if (element->name->text[0] == '[') {
967 /* the element is itself an array */
968 namebuf = DMNEW(char, namelen + dim);
969 memcpy(namebuf + dim, element->name->text, namelen);
973 /* the element is a non-array class */
974 namebuf = DMNEW(char, namelen + 2 + dim);
976 memcpy(namebuf + dim + 1, element->name->text, namelen);
977 namelen += (2 + dim);
978 namebuf[namelen - 1] = ';';
980 memset(namebuf, '[', dim);
982 c = get_array_class(utf_new(namebuf, namelen),
983 element->classloader,
984 element->classloader,
987 dump_release(dumpsize);
993 /* class_lookup_classref *******************************************************
995 Looks up the constant_classref for a given classname in the classref
999 cls..............the class containing the reference
1000 name.............the name of the class refered to
1003 a pointer to a constant_classref, or
1004 NULL if the reference was not found
1006 *******************************************************************************/
1008 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
1010 constant_classref *ref;
1011 extra_classref *xref;
1016 assert(!cls->classrefcount || cls->classrefs);
1018 /* first search the main classref table */
1019 count = cls->classrefcount;
1020 ref = cls->classrefs;
1021 for (; count; --count, ++ref)
1022 if (ref->name == name)
1025 /* next try the list of extra classrefs */
1026 for (xref = cls->extclassrefs; xref; xref = xref->next) {
1027 if (xref->classref.name == name)
1028 return &(xref->classref);
1036 /* class_get_classref **********************************************************
1038 Returns the constant_classref for a given classname.
1041 cls..............the class containing the reference
1042 name.............the name of the class refered to
1045 a pointer to a constant_classref (never NULL)
1048 The given name is not checked for validity!
1050 *******************************************************************************/
1052 constant_classref *class_get_classref(classinfo *cls, utf *name)
1054 constant_classref *ref;
1055 extra_classref *xref;
1060 ref = class_lookup_classref(cls,name);
1064 xref = NEW(extra_classref);
1065 CLASSREF_INIT(xref->classref,cls,name);
1067 xref->next = cls->extclassrefs;
1068 cls->extclassrefs = xref;
1070 return &(xref->classref);
1074 /* class_get_self_classref *****************************************************
1076 Returns the constant_classref to the class itself.
1079 cls..............the class containing the reference
1082 a pointer to a constant_classref (never NULL)
1084 *******************************************************************************/
1086 constant_classref *class_get_self_classref(classinfo *cls)
1088 /* XXX this should be done in a faster way. Maybe always make */
1089 /* the classref of index 0 a self reference. */
1090 return class_get_classref(cls,cls->name);
1093 /* class_get_classref_multiarray_of ********************************************
1095 Returns an array type reference with the given dimension and element class
1099 dim..............the requested dimension
1100 dim must be in [1;255]. This is NOT checked!
1101 ref..............the component class reference
1104 a pointer to the class reference for the array type
1107 The referer of `ref` is used as the referer for the new classref.
1109 *******************************************************************************/
1111 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1116 constant_classref *cr;
1119 assert(dim >= 1 && dim <= 255);
1121 dumpsize = dump_size();
1123 /* Assemble the array class name */
1124 namelen = ref->name->blength;
1126 if (ref->name->text[0] == '[') {
1127 /* the element is itself an array */
1128 namebuf = DMNEW(char, namelen + dim);
1129 memcpy(namebuf + dim, ref->name->text, namelen);
1133 /* the element is a non-array class */
1134 namebuf = DMNEW(char, namelen + 2 + dim);
1136 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1137 namelen += (2 + dim);
1138 namebuf[namelen - 1] = ';';
1140 memset(namebuf, '[', dim);
1142 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1144 dump_release(dumpsize);
1150 /* class_get_classref_component_of *********************************************
1152 Returns the component classref of a given array type reference
1155 ref..............the array type reference
1158 a reference to the component class, or
1159 NULL if `ref` is not an object array type reference
1162 The referer of `ref` is used as the referer for the new classref.
1164 *******************************************************************************/
1166 constant_classref *class_get_classref_component_of(constant_classref *ref)
1173 name = ref->name->text;
1177 namelen = ref->name->blength - 1;
1182 else if (*name != '[') {
1186 return class_get_classref(ref->referer, utf_new(name, namelen));
1190 /* class_findmethod ************************************************************
1192 Searches a 'classinfo' structure for a method having the given name
1193 and descriptor. If descriptor is NULL, it is ignored.
1195 *******************************************************************************/
1197 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1202 for (i = 0; i < c->methodscount; i++) {
1203 m = &(c->methods[i]);
1205 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1213 /* class_resolvemethod *********************************************************
1215 Searches a class and it's super classes for a method.
1217 Superinterfaces are *not* searched.
1219 *******************************************************************************/
1221 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1226 m = class_findmethod(c, name, desc);
1231 /* JVM Specification bug:
1233 It is important NOT to resolve special <init> and <clinit>
1234 methods to super classes or interfaces; yet, this is not
1235 explicited in the specification. Section 5.4.3.3 should be
1236 updated appropriately. */
1238 if (name == utf_init || name == utf_clinit)
1248 /* class_resolveinterfacemethod_intern *****************************************
1250 Internally used helper function. Do not use this directly.
1252 *******************************************************************************/
1254 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1255 utf *name, utf *desc)
1260 /* try to find the method in the class */
1262 m = class_findmethod(c, name, desc);
1267 /* no method found? try the superinterfaces */
1269 for (i = 0; i < c->interfacescount; i++) {
1270 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1277 /* no method found */
1283 /* class_resolveclassmethod ****************************************************
1285 Resolves a reference from REFERER to a method with NAME and DESC in
1288 If the method cannot be resolved the return value is NULL. If
1289 EXCEPT is true *exceptionptr is set, too.
1291 *******************************************************************************/
1293 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1294 classinfo *referer, bool throwexception)
1300 /* if (c->flags & ACC_INTERFACE) { */
1301 /* if (throwexception) */
1302 /* *exceptionptr = */
1303 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1307 /* try class c and its superclasses */
1311 m = class_resolvemethod(cls, name, desc);
1316 /* try the superinterfaces */
1318 for (i = 0; i < c->interfacescount; i++) {
1319 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1327 exceptions_throw_nosuchmethoderror(c, name, desc);
1332 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1334 exceptions_throw_abstractmethoderror();
1339 /* XXX check access rights */
1345 /* class_resolveinterfacemethod ************************************************
1347 Resolves a reference from REFERER to a method with NAME and DESC in
1350 If the method cannot be resolved the return value is NULL. If
1351 EXCEPT is true *exceptionptr is set, too.
1353 *******************************************************************************/
1355 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1356 classinfo *referer, bool throwexception)
1360 if (!(c->flags & ACC_INTERFACE)) {
1362 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1367 mi = class_resolveinterfacemethod_intern(c, name, desc);
1372 /* try class java.lang.Object */
1374 mi = class_findmethod(class_java_lang_Object, name, desc);
1380 exceptions_throw_nosuchmethoderror(c, name, desc);
1386 /* class_findfield *************************************************************
1388 Searches for field with specified name and type in a classinfo
1389 structure. If no such field is found NULL is returned.
1391 *******************************************************************************/
1393 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1397 for (i = 0; i < c->fieldscount; i++)
1398 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1399 return &(c->fields[i]);
1402 return class_findfield(c->super.cls, name, desc);
1408 /* class_findfield_approx ******************************************************
1410 Searches in 'classinfo'-structure for a field with the specified
1413 *******************************************************************************/
1415 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1419 /* get field index */
1421 i = class_findfield_index_by_name(c, name);
1423 /* field was not found, return */
1428 /* return field address */
1430 return &(c->fields[i]);
1434 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1438 for (i = 0; i < c->fieldscount; i++) {
1439 /* compare field names */
1441 if ((c->fields[i].name == name))
1445 /* field was not found, raise exception */
1447 exceptions_throw_nosuchfielderror(c, name);
1453 /****************** Function: class_resolvefield_int ***************************
1455 This is an internally used helper function. Do not use this directly.
1457 Tries to resolve a field having the given name and type.
1458 If the field cannot be resolved, NULL is returned.
1460 *******************************************************************************/
1462 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1467 /* search for field in class c */
1469 for (i = 0; i < c->fieldscount; i++) {
1470 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1471 return &(c->fields[i]);
1475 /* try superinterfaces recursively */
1477 for (i = 0; i < c->interfacescount; i++) {
1478 fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
1483 /* try superclass */
1486 return class_resolvefield_int(c->super.cls, name, desc);
1494 /********************* Function: class_resolvefield ***************************
1496 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1498 If the field cannot be resolved the return value is NULL. If EXCEPT is
1499 true *exceptionptr is set, too.
1501 *******************************************************************************/
1503 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1504 classinfo *referer, bool throwexception)
1508 fi = class_resolvefield_int(c, name, desc);
1512 exceptions_throw_nosuchfielderror(c, name);
1517 /* XXX check access rights */
1523 /* class_resolve_superclass ****************************************************
1525 Resolves the super class reference of the given class if necessary.
1527 *******************************************************************************/
1529 static classinfo *class_resolve_superclass(classinfo *c)
1533 if (c->super.any == NULL)
1536 /* Do we have a super class reference or is it already
1539 if (IS_CLASSREF(c->super)) {
1540 super = resolve_classref_or_classinfo_eager(c->super, true);
1545 /* Store the resolved super class in the class structure. */
1547 c->super.cls = super;
1550 return c->super.cls;
1554 /* class_issubclass ************************************************************
1556 Checks if sub is a descendant of super.
1558 *******************************************************************************/
1560 bool class_issubclass(classinfo *sub, classinfo *super)
1569 sub = class_resolve_superclass(sub);
1574 /* class_isanysubclass *********************************************************
1576 Checks a subclass relation between two classes. Implemented
1577 interfaces are interpreted as super classes.
1579 Return value: 1 ... sub is subclass of super
1582 *******************************************************************************/
1584 bool class_isanysubclass(classinfo *sub, classinfo *super)
1589 /* This is the trivial case. */
1594 /* Primitive classes are only subclasses of themselves. */
1596 if (class_is_primitive(sub) || class_is_primitive(super))
1599 /* Check for interfaces. */
1601 if (super->flags & ACC_INTERFACE) {
1602 result = (sub->vftbl->interfacetablelength > super->index) &&
1603 (sub->vftbl->interfacetable[-super->index] != NULL);
1606 /* java.lang.Object is the only super class of any
1609 if (sub->flags & ACC_INTERFACE)
1610 return (super == class_java_lang_Object);
1612 LOCK_MONITOR_ENTER(linker_classrenumber_lock);
1614 diffval = sub->vftbl->baseval - super->vftbl->baseval;
1615 result = diffval <= (uint32_t) super->vftbl->diffval;
1617 LOCK_MONITOR_EXIT(linker_classrenumber_lock);
1624 /* class_is_primitive **********************************************************
1626 Checks if the given class is a primitive class.
1628 *******************************************************************************/
1630 bool class_is_primitive(classinfo *c)
1632 if (c->flags & ACC_CLASS_PRIMITIVE)
1639 /* class_is_anonymousclass *****************************************************
1641 Checks if the given class is an anonymous class.
1643 *******************************************************************************/
1645 bool class_is_anonymousclass(classinfo *c)
1647 if (c->flags & ACC_CLASS_ANONYMOUS)
1654 /* class_is_array **************************************************************
1656 Checks if the given class is an array class.
1658 *******************************************************************************/
1660 bool class_is_array(classinfo *c)
1662 if (!(c->state & CLASS_LINKED))
1666 return (c->vftbl->arraydesc != NULL);
1670 /* class_is_interface **********************************************************
1672 Checks if the given class is an interface.
1674 *******************************************************************************/
1676 bool class_is_interface(classinfo *c)
1678 if (c->flags & ACC_INTERFACE)
1685 /* class_is_localclass *********************************************************
1687 Checks if the given class is a local class.
1689 *******************************************************************************/
1691 bool class_is_localclass(classinfo *c)
1693 if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
1700 /* class_is_memberclass ********************************************************
1702 Checks if the given class is a member class.
1704 *******************************************************************************/
1706 bool class_is_memberclass(classinfo *c)
1708 if (c->flags & ACC_CLASS_MEMBER)
1715 /* class_get_superclass ********************************************************
1717 Return the super class of the given class. If the super-field is a
1718 class-reference, resolve it and store it in the classinfo.
1720 *******************************************************************************/
1722 classinfo *class_get_superclass(classinfo *c)
1726 /* For java.lang.Object, primitive and Void classes we return
1729 if (c->super.any == NULL)
1732 /* For interfaces we also return NULL. */
1734 if (c->flags & ACC_INTERFACE)
1737 /* We may have to resolve the super class reference. */
1739 super = class_resolve_superclass(c);
1745 /* class_get_componenttype *****************************************************
1747 Return the component class of the given class. If the given class
1748 is not an array, return NULL.
1750 *******************************************************************************/
1752 classinfo *class_get_componenttype(classinfo *c)
1754 classinfo *component;
1755 arraydescriptor *ad;
1757 /* XXX maybe we could find a way to do this without linking. */
1758 /* This way should be safe and easy, however. */
1760 if (!(c->state & CLASS_LINKED))
1764 ad = c->vftbl->arraydesc;
1769 if (ad->arraytype == ARRAYTYPE_OBJECT)
1770 component = ad->componentvftbl->class;
1772 component = primitive_class_get_by_type(ad->arraytype);
1778 /* class_get_declaredclasses ***************************************************
1780 Return an array of declared classes of the given class.
1782 *******************************************************************************/
1784 java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly)
1786 classref_or_classinfo inner;
1787 classref_or_classinfo outer;
1789 int declaredclasscount; /* number of declared classes */
1790 int pos; /* current declared class */
1791 java_handle_objectarray_t *oa; /* array of declared classes */
1795 declaredclasscount = 0;
1797 if (!class_is_primitive(c) && !class_is_array(c)) {
1798 /* Determine number of declared classes. */
1800 for (i = 0; i < c->innerclasscount; i++) {
1801 /* Get outer-class. If the inner-class is not a member
1802 class, the outer-class is NULL. */
1804 outer = c->innerclass[i].outer_class;
1806 if (outer.any == NULL)
1809 /* Check if outer-class is a classref or a real class and
1810 get the class name from the structure. */
1812 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1814 /* Outer class is this class. */
1816 if ((outername == c->name) &&
1817 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC)))
1818 declaredclasscount++;
1822 /* Allocate Class[] and check for OOM. */
1824 oa = builtin_anewarray(declaredclasscount, class_java_lang_Class);
1829 for (i = 0, pos = 0; i < c->innerclasscount; i++) {
1830 inner = c->innerclass[i].inner_class;
1831 outer = c->innerclass[i].outer_class;
1833 /* Get outer-class. If the inner-class is not a member class,
1834 the outer-class is NULL. */
1836 if (outer.any == NULL)
1839 /* Check if outer_class is a classref or a real class and get
1840 the class name from the structure. */
1842 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1844 /* Outer class is this class. */
1846 if ((outername == c->name) &&
1847 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC))) {
1849 ic = resolve_classref_or_classinfo_eager(inner, false);
1854 if (!(ic->state & CLASS_LINKED))
1855 if (!link_class(ic))
1858 LLNI_array_direct(oa, pos++) = (java_object_t *) ic;
1866 /* class_get_declaringclass ****************************************************
1868 If the class or interface given is a member of another class,
1869 return the declaring class. For array and primitive classes return
1872 *******************************************************************************/
1874 classinfo *class_get_declaringclass(classinfo *c)
1876 classref_or_classinfo cr;
1879 /* Get declaring class. */
1881 cr = c->declaringclass;
1886 /* Resolve the class if necessary. */
1888 if (IS_CLASSREF(cr)) {
1889 /* dc = resolve_classref_eager(cr.ref); */
1890 dc = resolve_classref_or_classinfo_eager(cr, true);
1895 /* Store the resolved class in the class structure. */
1906 /* class_get_enclosingclass ****************************************************
1908 Return the enclosing class for the given class.
1910 *******************************************************************************/
1912 classinfo *class_get_enclosingclass(classinfo *c)
1914 classref_or_classinfo cr;
1917 /* Get enclosing class. */
1919 cr = c->enclosingclass;
1924 /* Resolve the class if necessary. */
1926 if (IS_CLASSREF(cr)) {
1927 /* ec = resolve_classref_eager(cr.ref); */
1928 ec = resolve_classref_or_classinfo_eager(cr, true);
1933 /* Store the resolved class in the class structure. */
1944 /* class_get_interfaces ********************************************************
1946 Return an array of interfaces of the given class.
1948 *******************************************************************************/
1950 java_handle_objectarray_t *class_get_interfaces(classinfo *c)
1953 java_handle_objectarray_t *oa;
1956 if (!(c->state & CLASS_LINKED))
1960 oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
1965 for (i = 0; i < c->interfacescount; i++) {
1966 ic = c->interfaces[i].cls;
1968 LLNI_array_direct(oa, i) = (java_object_t *) ic;
1975 /* class_get_signature *********************************************************
1977 Return the signature of the given class. For array and primitive
1978 classes return NULL.
1980 *******************************************************************************/
1982 #if defined(ENABLE_JAVASE)
1983 utf *class_get_signature(classinfo *c)
1985 /* For array and primitive classes return NULL. */
1987 if (class_is_array(c) || class_is_primitive(c))
1990 return c->signature;
1995 /* class_printflags ************************************************************
1997 Prints flags of a class.
1999 *******************************************************************************/
2001 #if !defined(NDEBUG)
2002 void class_printflags(classinfo *c)
2009 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
2010 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
2011 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
2012 if (c->flags & ACC_STATIC) printf(" STATIC");
2013 if (c->flags & ACC_FINAL) printf(" FINAL");
2014 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
2015 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
2016 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
2017 if (c->flags & ACC_NATIVE) printf(" NATIVE");
2018 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
2019 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
2024 /* class_print *****************************************************************
2026 Prints classname plus flags.
2028 *******************************************************************************/
2030 #if !defined(NDEBUG)
2031 void class_print(classinfo *c)
2038 utf_display_printable_ascii(c->name);
2039 class_printflags(c);
2044 /* class_classref_print ********************************************************
2046 Prints classname plus referer class.
2048 *******************************************************************************/
2050 #if !defined(NDEBUG)
2051 void class_classref_print(constant_classref *cr)
2058 utf_display_printable_ascii(cr->name);
2061 class_print(cr->referer);
2069 /* class_println ***************************************************************
2071 Prints classname plus flags and new line.
2073 *******************************************************************************/
2075 #if !defined(NDEBUG)
2076 void class_println(classinfo *c)
2084 /* class_classref_println ******************************************************
2086 Prints classname plus referer class and new line.
2088 *******************************************************************************/
2090 #if !defined(NDEBUG)
2091 void class_classref_println(constant_classref *cr)
2093 class_classref_print(cr);
2099 /* class_classref_or_classinfo_print *******************************************
2101 Prints classname plus referer class.
2103 *******************************************************************************/
2105 #if !defined(NDEBUG)
2106 void class_classref_or_classinfo_print(classref_or_classinfo c)
2108 if (c.any == NULL) {
2109 printf("(classref_or_classinfo) NULL");
2113 class_classref_print(c.ref);
2120 /* class_classref_or_classinfo_println *****************************************
2122 Prints classname plus referer class and a newline.
2124 *******************************************************************************/
2126 void class_classref_or_classinfo_println(classref_or_classinfo c)
2128 class_classref_or_classinfo_println(c);
2133 /* class_showconstantpool ******************************************************
2135 Dump the constant pool of the given class to stdout.
2137 *******************************************************************************/
2139 #if !defined(NDEBUG)
2140 void class_showconstantpool (classinfo *c)
2145 printf ("---- dump of constant pool ----\n");
2147 for (i=0; i<c->cpcount; i++) {
2148 printf ("#%d: ", (int) i);
2150 e = c -> cpinfos [i];
2153 switch (c -> cptags [i]) {
2154 case CONSTANT_Class:
2155 printf ("Classreference -> ");
2156 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
2158 case CONSTANT_Fieldref:
2159 printf ("Fieldref -> ");
2160 field_fieldref_print((constant_FMIref *) e);
2162 case CONSTANT_Methodref:
2163 printf ("Methodref -> ");
2164 method_methodref_print((constant_FMIref *) e);
2166 case CONSTANT_InterfaceMethodref:
2167 printf ("InterfaceMethod -> ");
2168 method_methodref_print((constant_FMIref *) e);
2170 case CONSTANT_String:
2171 printf ("String -> ");
2172 utf_display_printable_ascii (e);
2174 case CONSTANT_Integer:
2175 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
2177 case CONSTANT_Float:
2178 printf ("Float -> %f", ((constant_float*)e) -> value);
2180 case CONSTANT_Double:
2181 printf ("Double -> %f", ((constant_double*)e) -> value);
2185 u8 v = ((constant_long*)e) -> value;
2187 printf ("Long -> %ld", (long int) v);
2189 printf ("Long -> HI: %ld, LO: %ld\n",
2190 (long int) v.high, (long int) v.low);
2194 case CONSTANT_NameAndType:
2196 constant_nameandtype *cnt = e;
2197 printf ("NameAndType: ");
2198 utf_display_printable_ascii (cnt->name);
2200 utf_display_printable_ascii (cnt->descriptor);
2204 printf ("Utf8 -> ");
2205 utf_display_printable_ascii (e);
2208 log_text("Invalid type of ConstantPool-Entry");
2216 #endif /* !defined(NDEBUG) */
2219 /* class_showmethods ***********************************************************
2221 Dump info about the fields and methods of the given class to stdout.
2223 *******************************************************************************/
2225 #if !defined(NDEBUG)
2226 void class_showmethods (classinfo *c)
2230 printf("--------- Fields and Methods ----------------\n");
2232 class_printflags(c);
2236 utf_display_printable_ascii(c->name);
2241 utf_display_printable_ascii(c->super.cls->name);
2245 printf("Index: %d\n", c->index);
2247 printf("Interfaces:\n");
2248 for (i = 0; i < c->interfacescount; i++) {
2250 utf_display_printable_ascii(c->interfaces[i].cls->name);
2251 printf (" (%d)\n", c->interfaces[i].cls->index);
2254 printf("Fields:\n");
2255 for (i = 0; i < c->fieldscount; i++)
2256 field_println(&(c->fields[i]));
2258 printf("Methods:\n");
2259 for (i = 0; i < c->methodscount; i++) {
2260 methodinfo *m = &(c->methods[i]);
2262 if (!(m->flags & ACC_STATIC))
2263 printf("vftblindex: %d ", m->vftblindex);
2268 printf ("Virtual function table:\n");
2269 for (i = 0; i < c->vftbl->vftbllength; i++)
2270 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2272 #endif /* !defined(NDEBUG) */
2276 * These are local overrides for various environment variables in Emacs.
2277 * Please do not remove this and leave it at the end of the file, where
2278 * Emacs will automagically detect them.
2279 * ---------------------------------------------------------------------
2282 * indent-tabs-mode: t
2286 * vim:noexpandtab:sw=4:ts=4: