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 8343 2007-08-17 21:39:32Z michi $
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 #if defined(ENABLE_GC_CACAO)
223 c = (classinfo *) heap_alloc_uncollectable(sizeof(classinfo));
225 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
226 /*c=NEW(classinfo);*/
230 /* Set the header.vftbl of all loaded classes to the one of
231 java.lang.Class, so Java code can use a class as object. */
233 if (class_java_lang_Class != NULL)
234 if (class_java_lang_Class->vftbl != NULL)
235 c->object.header.vftbl = class_java_lang_Class->vftbl;
237 #if defined(ENABLE_JAVASE)
238 /* check if the class is a reference class and flag it */
240 if (classname == utf_java_lang_ref_SoftReference) {
241 c->flags |= ACC_CLASS_REFERENCE_SOFT;
243 else if (classname == utf_java_lang_ref_WeakReference) {
244 c->flags |= ACC_CLASS_REFERENCE_WEAK;
246 else if (classname == utf_java_lang_ref_PhantomReference) {
247 c->flags |= ACC_CLASS_REFERENCE_PHANTOM;
251 if (classname != utf_not_named_yet)
252 class_set_packagename(c);
254 LOCK_INIT_OBJECT_LOCK(&c->object.header);
260 /* class_postset_header_vftbl **************************************************
262 Set the header.vftbl of all classes created before java.lang.Class
263 was linked. This is necessary that Java code can use a class as
266 *******************************************************************************/
268 void class_postset_header_vftbl(void)
272 classcache_name_entry *nmen;
273 classcache_class_entry *clsen;
275 assert(class_java_lang_Class);
277 for (slot = 0; slot < hashtable_classcache.size; slot++) {
278 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
280 for (; nmen; nmen = nmen->hashlink) {
281 /* iterate over all class entries */
283 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
286 /* now set the the vftbl */
288 if (c->object.header.vftbl == NULL)
289 c->object.header.vftbl = class_java_lang_Class->vftbl;
295 /* class_define ****************************************************************
297 Calls the loader and defines a class in the VM.
299 *******************************************************************************/
301 classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data)
308 /* check if this class has already been defined */
310 c = classcache_lookup_defined_or_initiated(cl, name);
313 exceptions_throw_linkageerror("duplicate class definition: ", c);
318 /* create a new classinfo struct */
320 c = class_create_classinfo(name);
322 #if defined(ENABLE_STATISTICS)
325 if (opt_getloadingtime)
329 /* build a classbuffer with the given data */
331 cb = NEW(classbuffer);
338 /* preset the defining classloader */
342 /* load the class from this buffer */
344 r = load_class_from_classbuffer(cb);
348 FREE(cb, classbuffer);
350 #if defined(ENABLE_STATISTICS)
353 if (opt_getloadingtime)
358 /* If return value is NULL, we had a problem and the class is
359 not loaded. Now free the allocated memory, otherwise we
360 could run into a DOS. */
367 /* Store the newly defined class in the class cache. This call
368 also checks whether a class of the same name has already been
369 defined by the same defining loader, and if so, replaces the
370 newly created class by the one defined earlier. */
372 /* Important: The classinfo given to classcache_store must be
373 fully prepared because another thread may return
374 this pointer after the lookup at to top of this
375 function directly after the class cache lock has
378 c = classcache_store(cl, c, true);
384 /* class_load_attribute_sourcefile *********************************************
386 SourceFile_attribute {
387 u2 attribute_name_index;
392 *******************************************************************************/
394 static bool class_load_attribute_sourcefile(classbuffer *cb)
405 /* check buffer size */
407 if (!suck_check_classbuffer_size(cb, 4 + 2))
410 /* check attribute length */
412 attribute_length = suck_u4(cb);
414 if (attribute_length != 2) {
415 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
419 /* there can be no more than one SourceFile attribute */
421 if (c->sourcefile != NULL) {
422 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
428 sourcefile_index = suck_u2(cb);
429 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
431 if (sourcefile == NULL)
434 /* store sourcefile */
436 c->sourcefile = sourcefile;
442 /* class_load_attribute_enclosingmethod ****************************************
444 EnclosingMethod_attribute {
445 u2 attribute_name_index;
451 *******************************************************************************/
453 #if defined(ENABLE_JAVASE)
454 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
460 classref_or_classinfo cr;
461 constant_nameandtype *cn;
467 /* check buffer size */
469 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
472 /* check attribute length */
474 attribute_length = suck_u4(cb);
476 if (attribute_length != 4) {
477 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
481 /* there can be no more than one EnclosingMethod attribute */
483 if (c->enclosingmethod != NULL) {
484 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
488 /* get class index */
490 class_index = suck_u2(cb);
491 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
493 /* get method index */
495 method_index = suck_u2(cb);
496 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
498 /* store info in classinfo */
500 c->enclosingclass.any = cr.any;
501 c->enclosingmethod = cn;
505 #endif /* defined(ENABLE_JAVASE) */
508 /* class_load_attributes *******************************************************
510 Read attributes from ClassFile.
513 u2 attribute_name_index;
515 u1 info[attribute_length];
518 InnerClasses_attribute {
519 u2 attribute_name_index;
523 *******************************************************************************/
525 bool class_load_attributes(classbuffer *cb)
528 uint16_t attributes_count;
529 uint16_t attribute_name_index;
531 innerclassinfo *info;
532 classref_or_classinfo inner;
533 classref_or_classinfo outer;
540 /* get attributes count */
542 if (!suck_check_classbuffer_size(cb, 2))
545 attributes_count = suck_u2(cb);
547 for (i = 0; i < attributes_count; i++) {
548 /* get attribute name */
550 if (!suck_check_classbuffer_size(cb, 2))
553 attribute_name_index = suck_u2(cb);
555 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
557 if (attribute_name == NULL)
560 if (attribute_name == utf_InnerClasses) {
563 if (c->innerclass != NULL) {
564 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
568 if (!suck_check_classbuffer_size(cb, 4 + 2))
571 /* skip attribute length */
574 /* number of records */
575 c->innerclasscount = suck_u2(cb);
577 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
580 /* allocate memory for innerclass structure */
581 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
583 for (j = 0; j < c->innerclasscount; j++) {
584 /* The innerclass structure contains a class with an encoded
585 name, its defining scope, its simple name and a bitmask of
588 info = c->innerclass + j;
590 inner.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
591 outer.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
592 name = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
595 /* If the current inner-class is the currently loaded
596 class check for some special flags. */
598 if (inner.ref->name == c->name) {
599 /* If an inner-class is not a member, its
600 outer-class is NULL. */
602 if (outer.ref != NULL) {
603 c->flags |= ACC_CLASS_MEMBER;
605 /* A member class doesn't have an
606 EnclosingMethod attribute, so set the
607 enclosing-class to be the same as the
610 c->declaringclass = outer;
611 c->enclosingclass = outer;
614 /* If an inner-class is anonymous, its name is
618 c->flags |= ACC_CLASS_ANONYMOUS;
621 info->inner_class = inner;
622 info->outer_class = outer;
627 else if (attribute_name == utf_SourceFile) {
630 if (!class_load_attribute_sourcefile(cb))
633 #if defined(ENABLE_JAVASE)
634 else if (attribute_name == utf_EnclosingMethod) {
635 /* EnclosingMethod */
637 if (!class_load_attribute_enclosingmethod(cb))
640 else if (attribute_name == utf_Signature) {
643 if (!loader_load_attribute_signature(cb, &(c->signature)))
648 #if defined(ENABLE_ANNOTATIONS)
649 /* XXX We can't do a release with that enabled */
651 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
652 /* RuntimeVisibleAnnotations */
653 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
656 /* XXX RuntimeInvisibleAnnotations should only be loaded
657 * (or returned to Java) if some commandline options says so.
658 * Currently there is no such option available in cacao,
659 * therefore I load them allways (for testing purpose).
660 * Anyway, bytecode for RuntimeInvisibleAnnotations is only
661 * generated if you tell javac to do so. So in most cases
662 * there won't be any.
664 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
665 /* RuntimeInvisibleAnnotations */
666 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
672 /* unknown attribute */
674 if (!loader_skip_attribute_body(cb))
683 /* class_freepool **************************************************************
685 Frees all resources used by this classes Constant Pool.
687 *******************************************************************************/
689 static void class_freecpool(classinfo *c)
695 if (c->cptags && c->cpinfos) {
696 for (idx = 0; idx < c->cpcount; idx++) {
697 tag = c->cptags[idx];
698 info = c->cpinfos[idx];
702 case CONSTANT_Fieldref:
703 case CONSTANT_Methodref:
704 case CONSTANT_InterfaceMethodref:
705 FREE(info, constant_FMIref);
707 case CONSTANT_Integer:
708 FREE(info, constant_integer);
711 FREE(info, constant_float);
714 FREE(info, constant_long);
716 case CONSTANT_Double:
717 FREE(info, constant_double);
719 case CONSTANT_NameAndType:
720 FREE(info, constant_nameandtype);
728 MFREE(c->cptags, u1, c->cpcount);
731 MFREE(c->cpinfos, voidptr, c->cpcount);
735 /* class_getconstant ***********************************************************
737 Retrieves the value at position 'pos' of the constantpool of a
738 class. If the type of the value is other than 'ctype', an error is
741 *******************************************************************************/
743 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
745 /* check index and type of constantpool entry */
746 /* (pos == 0 is caught by type comparison) */
748 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
749 exceptions_throw_classformaterror(c, "Illegal constant pool index");
753 return c->cpinfos[pos];
757 /* innerclass_getconstant ******************************************************
759 Like class_getconstant, but if cptags is ZERO, null is returned.
761 *******************************************************************************/
763 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
765 /* invalid position in constantpool */
767 if (pos >= c->cpcount) {
768 exceptions_throw_classformaterror(c, "Illegal constant pool index");
772 /* constantpool entry of type 0 */
774 if (c->cptags[pos] == 0)
777 /* check type of constantpool entry */
779 if (c->cptags[pos] != ctype) {
780 exceptions_throw_classformaterror(c, "Illegal constant pool index");
784 return c->cpinfos[pos];
788 /* class_free ******************************************************************
790 Frees all resources used by the class.
792 *******************************************************************************/
794 void class_free(classinfo *c)
802 MFREE(c->interfaces, classinfo*, c->interfacescount);
805 for (i = 0; i < c->fieldscount; i++)
806 field_free(&(c->fields[i]));
807 #if defined(ENABLE_CACAO_GC)
808 MFREE(c->fields, fieldinfo, c->fieldscount);
813 for (i = 0; i < c->methodscount; i++)
814 method_free(&(c->methods[i]));
815 MFREE(c->methods, methodinfo, c->methodscount);
818 if ((v = c->vftbl) != NULL) {
820 mem_free(v->arraydesc,sizeof(arraydescriptor));
822 for (i = 0; i < v->interfacetablelength; i++) {
823 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
825 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
827 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
828 sizeof(methodptr*) * (v->interfacetablelength -
829 (v->interfacetablelength > 0));
830 v = (vftbl_t*) (((methodptr*) v) -
831 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
836 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
838 /* if (c->classvftbl)
839 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
843 #if defined(ENABLE_ANNOTATIONS)
844 annotation_bytearray_free(c->annotations);
846 annotation_bytearrays_free(c->method_annotations);
847 annotation_bytearrays_free(c->method_parameterannotations);
848 annotation_bytearrays_free(c->method_annotationdefaults);
850 annotation_bytearrays_free(c->field_annotations);
855 /* get_array_class *************************************************************
857 Returns the array class with the given name for the given
858 classloader, or NULL if an exception occurred.
860 Note: This function does eager loading.
862 *******************************************************************************/
864 static classinfo *get_array_class(utf *name,classloader *initloader,
865 classloader *defloader,bool link)
869 /* lookup this class in the classcache */
870 c = classcache_lookup(initloader,name);
872 c = classcache_lookup_defined(defloader,name);
875 /* we have to create it */
876 c = class_create_classinfo(name);
877 c = load_newly_created_array(c,initloader);
883 assert(c->state & CLASS_LOADED);
884 assert(c->classloader == defloader);
886 if (link && !(c->state & CLASS_LINKED))
890 assert(!link || (c->state & CLASS_LINKED));
896 /* class_array_of **************************************************************
898 Returns an array class with the given component class. The array
899 class is dynamically created if neccessary.
901 *******************************************************************************/
903 classinfo *class_array_of(classinfo *component, bool link)
912 cl = component->classloader;
914 dumpsize = dump_size();
916 /* Assemble the array class name */
917 namelen = component->name->blength;
919 if (component->name->text[0] == '[') {
920 /* the component is itself an array */
921 namebuf = DMNEW(char, namelen + 1);
923 MCOPY(namebuf + 1, component->name->text, char, namelen);
927 /* the component is a non-array class */
928 namebuf = DMNEW(char, namelen + 3);
931 MCOPY(namebuf + 2, component->name->text, char, namelen);
932 namebuf[2 + namelen] = ';';
936 u = utf_new(namebuf, namelen);
938 c = get_array_class(u, cl, cl, link);
940 dump_release(dumpsize);
946 /* class_multiarray_of *********************************************************
948 Returns an array class with the given dimension and element class.
949 The array class is dynamically created if neccessary.
951 *******************************************************************************/
953 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
960 dumpsize = dump_size();
963 log_text("Invalid array dimension requested");
967 /* Assemble the array class name */
968 namelen = element->name->blength;
970 if (element->name->text[0] == '[') {
971 /* the element is itself an array */
972 namebuf = DMNEW(char, namelen + dim);
973 memcpy(namebuf + dim, element->name->text, namelen);
977 /* the element is a non-array class */
978 namebuf = DMNEW(char, namelen + 2 + dim);
980 memcpy(namebuf + dim + 1, element->name->text, namelen);
981 namelen += (2 + dim);
982 namebuf[namelen - 1] = ';';
984 memset(namebuf, '[', dim);
986 c = get_array_class(utf_new(namebuf, namelen),
987 element->classloader,
988 element->classloader,
991 dump_release(dumpsize);
997 /* class_lookup_classref *******************************************************
999 Looks up the constant_classref for a given classname in the classref
1003 cls..............the class containing the reference
1004 name.............the name of the class refered to
1007 a pointer to a constant_classref, or
1008 NULL if the reference was not found
1010 *******************************************************************************/
1012 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
1014 constant_classref *ref;
1015 extra_classref *xref;
1020 assert(!cls->classrefcount || cls->classrefs);
1022 /* first search the main classref table */
1023 count = cls->classrefcount;
1024 ref = cls->classrefs;
1025 for (; count; --count, ++ref)
1026 if (ref->name == name)
1029 /* next try the list of extra classrefs */
1030 for (xref = cls->extclassrefs; xref; xref = xref->next) {
1031 if (xref->classref.name == name)
1032 return &(xref->classref);
1040 /* class_get_classref **********************************************************
1042 Returns the constant_classref for a given classname.
1045 cls..............the class containing the reference
1046 name.............the name of the class refered to
1049 a pointer to a constant_classref (never NULL)
1052 The given name is not checked for validity!
1054 *******************************************************************************/
1056 constant_classref *class_get_classref(classinfo *cls, utf *name)
1058 constant_classref *ref;
1059 extra_classref *xref;
1064 ref = class_lookup_classref(cls,name);
1068 xref = NEW(extra_classref);
1069 CLASSREF_INIT(xref->classref,cls,name);
1071 xref->next = cls->extclassrefs;
1072 cls->extclassrefs = xref;
1074 return &(xref->classref);
1078 /* class_get_self_classref *****************************************************
1080 Returns the constant_classref to the class itself.
1083 cls..............the class containing the reference
1086 a pointer to a constant_classref (never NULL)
1088 *******************************************************************************/
1090 constant_classref *class_get_self_classref(classinfo *cls)
1092 /* XXX this should be done in a faster way. Maybe always make */
1093 /* the classref of index 0 a self reference. */
1094 return class_get_classref(cls,cls->name);
1097 /* class_get_classref_multiarray_of ********************************************
1099 Returns an array type reference with the given dimension and element class
1103 dim..............the requested dimension
1104 dim must be in [1;255]. This is NOT checked!
1105 ref..............the component class reference
1108 a pointer to the class reference for the array type
1111 The referer of `ref` is used as the referer for the new classref.
1113 *******************************************************************************/
1115 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1120 constant_classref *cr;
1123 assert(dim >= 1 && dim <= 255);
1125 dumpsize = dump_size();
1127 /* Assemble the array class name */
1128 namelen = ref->name->blength;
1130 if (ref->name->text[0] == '[') {
1131 /* the element is itself an array */
1132 namebuf = DMNEW(char, namelen + dim);
1133 memcpy(namebuf + dim, ref->name->text, namelen);
1137 /* the element is a non-array class */
1138 namebuf = DMNEW(char, namelen + 2 + dim);
1140 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1141 namelen += (2 + dim);
1142 namebuf[namelen - 1] = ';';
1144 memset(namebuf, '[', dim);
1146 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1148 dump_release(dumpsize);
1154 /* class_get_classref_component_of *********************************************
1156 Returns the component classref of a given array type reference
1159 ref..............the array type reference
1162 a reference to the component class, or
1163 NULL if `ref` is not an object array type reference
1166 The referer of `ref` is used as the referer for the new classref.
1168 *******************************************************************************/
1170 constant_classref *class_get_classref_component_of(constant_classref *ref)
1177 name = ref->name->text;
1181 namelen = ref->name->blength - 1;
1186 else if (*name != '[') {
1190 return class_get_classref(ref->referer, utf_new(name, namelen));
1194 /* class_findmethod ************************************************************
1196 Searches a 'classinfo' structure for a method having the given name
1197 and descriptor. If descriptor is NULL, it is ignored.
1199 *******************************************************************************/
1201 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1206 for (i = 0; i < c->methodscount; i++) {
1207 m = &(c->methods[i]);
1209 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1217 /* class_resolvemethod *********************************************************
1219 Searches a class and it's super classes for a method.
1221 Superinterfaces are *not* searched.
1223 *******************************************************************************/
1225 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1230 m = class_findmethod(c, name, desc);
1235 /* JVM Specification bug:
1237 It is important NOT to resolve special <init> and <clinit>
1238 methods to super classes or interfaces; yet, this is not
1239 explicited in the specification. Section 5.4.3.3 should be
1240 updated appropriately. */
1242 if (name == utf_init || name == utf_clinit)
1252 /* class_resolveinterfacemethod_intern *****************************************
1254 Internally used helper function. Do not use this directly.
1256 *******************************************************************************/
1258 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1259 utf *name, utf *desc)
1264 /* try to find the method in the class */
1266 m = class_findmethod(c, name, desc);
1271 /* no method found? try the superinterfaces */
1273 for (i = 0; i < c->interfacescount; i++) {
1274 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1281 /* no method found */
1287 /* class_resolveclassmethod ****************************************************
1289 Resolves a reference from REFERER to a method with NAME and DESC in
1292 If the method cannot be resolved the return value is NULL. If
1293 EXCEPT is true *exceptionptr is set, too.
1295 *******************************************************************************/
1297 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1298 classinfo *referer, bool throwexception)
1304 /* if (c->flags & ACC_INTERFACE) { */
1305 /* if (throwexception) */
1306 /* *exceptionptr = */
1307 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1311 /* try class c and its superclasses */
1315 m = class_resolvemethod(cls, name, desc);
1320 /* try the superinterfaces */
1322 for (i = 0; i < c->interfacescount; i++) {
1323 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1331 exceptions_throw_nosuchmethoderror(c, name, desc);
1336 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1338 exceptions_throw_abstractmethoderror();
1343 /* XXX check access rights */
1349 /* class_resolveinterfacemethod ************************************************
1351 Resolves a reference from REFERER to a method with NAME and DESC in
1354 If the method cannot be resolved the return value is NULL. If
1355 EXCEPT is true *exceptionptr is set, too.
1357 *******************************************************************************/
1359 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1360 classinfo *referer, bool throwexception)
1364 if (!(c->flags & ACC_INTERFACE)) {
1366 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1371 mi = class_resolveinterfacemethod_intern(c, name, desc);
1376 /* try class java.lang.Object */
1378 mi = class_findmethod(class_java_lang_Object, name, desc);
1384 exceptions_throw_nosuchmethoderror(c, name, desc);
1390 /* class_findfield *************************************************************
1392 Searches for field with specified name and type in a classinfo
1393 structure. If no such field is found NULL is returned.
1395 *******************************************************************************/
1397 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1401 for (i = 0; i < c->fieldscount; i++)
1402 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1403 return &(c->fields[i]);
1406 return class_findfield(c->super.cls, name, desc);
1412 /* class_findfield_approx ******************************************************
1414 Searches in 'classinfo'-structure for a field with the specified
1417 *******************************************************************************/
1419 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1423 /* get field index */
1425 i = class_findfield_index_by_name(c, name);
1427 /* field was not found, return */
1432 /* return field address */
1434 return &(c->fields[i]);
1438 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1442 for (i = 0; i < c->fieldscount; i++) {
1443 /* compare field names */
1445 if ((c->fields[i].name == name))
1449 /* field was not found, raise exception */
1451 exceptions_throw_nosuchfielderror(c, name);
1457 /****************** Function: class_resolvefield_int ***************************
1459 This is an internally used helper function. Do not use this directly.
1461 Tries to resolve a field having the given name and type.
1462 If the field cannot be resolved, NULL is returned.
1464 *******************************************************************************/
1466 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1471 /* search for field in class c */
1473 for (i = 0; i < c->fieldscount; i++) {
1474 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1475 return &(c->fields[i]);
1479 /* try superinterfaces recursively */
1481 for (i = 0; i < c->interfacescount; i++) {
1482 fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
1487 /* try superclass */
1490 return class_resolvefield_int(c->super.cls, name, desc);
1498 /********************* Function: class_resolvefield ***************************
1500 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1502 If the field cannot be resolved the return value is NULL. If EXCEPT is
1503 true *exceptionptr is set, too.
1505 *******************************************************************************/
1507 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1508 classinfo *referer, bool throwexception)
1512 fi = class_resolvefield_int(c, name, desc);
1516 exceptions_throw_nosuchfielderror(c, name);
1521 /* XXX check access rights */
1527 /* class_resolve_superclass ****************************************************
1529 Resolves the super class reference of the given class if necessary.
1531 *******************************************************************************/
1533 static classinfo *class_resolve_superclass(classinfo *c)
1537 if (c->super.any == NULL)
1540 /* Do we have a super class reference or is it already
1543 if (IS_CLASSREF(c->super)) {
1544 super = resolve_classref_or_classinfo_eager(c->super, true);
1549 /* Store the resolved super class in the class structure. */
1551 c->super.cls = super;
1554 return c->super.cls;
1558 /* class_issubclass ************************************************************
1560 Checks if sub is a descendant of super.
1562 *******************************************************************************/
1564 bool class_issubclass(classinfo *sub, classinfo *super)
1573 sub = class_resolve_superclass(sub);
1578 /* class_isanysubclass *********************************************************
1580 Checks a subclass relation between two classes. Implemented
1581 interfaces are interpreted as super classes.
1583 Return value: 1 ... sub is subclass of super
1586 *******************************************************************************/
1588 bool class_isanysubclass(classinfo *sub, classinfo *super)
1593 /* This is the trivial case. */
1598 /* Primitive classes are only subclasses of themselves. */
1600 if (class_is_primitive(sub) || class_is_primitive(super))
1603 /* Check for interfaces. */
1605 if (super->flags & ACC_INTERFACE) {
1606 result = (sub->vftbl->interfacetablelength > super->index) &&
1607 (sub->vftbl->interfacetable[-super->index] != NULL);
1610 /* java.lang.Object is the only super class of any
1613 if (sub->flags & ACC_INTERFACE)
1614 return (super == class_java_lang_Object);
1616 LOCK_MONITOR_ENTER(linker_classrenumber_lock);
1618 diffval = sub->vftbl->baseval - super->vftbl->baseval;
1619 result = diffval <= (uint32_t) super->vftbl->diffval;
1621 LOCK_MONITOR_EXIT(linker_classrenumber_lock);
1628 /* class_is_primitive **********************************************************
1630 Checks if the given class is a primitive class.
1632 *******************************************************************************/
1634 bool class_is_primitive(classinfo *c)
1636 if (c->flags & ACC_CLASS_PRIMITIVE)
1643 /* class_is_anonymousclass *****************************************************
1645 Checks if the given class is an anonymous class.
1647 *******************************************************************************/
1649 bool class_is_anonymousclass(classinfo *c)
1651 if (c->flags & ACC_CLASS_ANONYMOUS)
1658 /* class_is_array **************************************************************
1660 Checks if the given class is an array class.
1662 *******************************************************************************/
1664 bool class_is_array(classinfo *c)
1666 if (!(c->state & CLASS_LINKED))
1670 return (c->vftbl->arraydesc != NULL);
1674 /* class_is_interface **********************************************************
1676 Checks if the given class is an interface.
1678 *******************************************************************************/
1680 bool class_is_interface(classinfo *c)
1682 if (c->flags & ACC_INTERFACE)
1689 /* class_is_localclass *********************************************************
1691 Checks if the given class is a local class.
1693 *******************************************************************************/
1695 bool class_is_localclass(classinfo *c)
1697 if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
1704 /* class_is_memberclass ********************************************************
1706 Checks if the given class is a member class.
1708 *******************************************************************************/
1710 bool class_is_memberclass(classinfo *c)
1712 if (c->flags & ACC_CLASS_MEMBER)
1719 /* class_get_superclass ********************************************************
1721 Return the super class of the given class. If the super-field is a
1722 class-reference, resolve it and store it in the classinfo.
1724 *******************************************************************************/
1726 classinfo *class_get_superclass(classinfo *c)
1730 /* For java.lang.Object, primitive and Void classes we return
1733 if (c->super.any == NULL)
1736 /* For interfaces we also return NULL. */
1738 if (c->flags & ACC_INTERFACE)
1741 /* We may have to resolve the super class reference. */
1743 super = class_resolve_superclass(c);
1749 /* class_get_componenttype *****************************************************
1751 Return the component class of the given class. If the given class
1752 is not an array, return NULL.
1754 *******************************************************************************/
1756 classinfo *class_get_componenttype(classinfo *c)
1758 classinfo *component;
1759 arraydescriptor *ad;
1761 /* XXX maybe we could find a way to do this without linking. */
1762 /* This way should be safe and easy, however. */
1764 if (!(c->state & CLASS_LINKED))
1768 ad = c->vftbl->arraydesc;
1773 if (ad->arraytype == ARRAYTYPE_OBJECT)
1774 component = ad->componentvftbl->class;
1776 component = primitive_class_get_by_type(ad->arraytype);
1782 /* class_get_declaredclasses ***************************************************
1784 Return an array of declared classes of the given class.
1786 *******************************************************************************/
1788 java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly)
1790 classref_or_classinfo inner;
1791 classref_or_classinfo outer;
1793 int declaredclasscount; /* number of declared classes */
1794 int pos; /* current declared class */
1795 java_handle_objectarray_t *oa; /* array of declared classes */
1799 declaredclasscount = 0;
1801 if (!class_is_primitive(c) && !class_is_array(c)) {
1802 /* Determine number of declared classes. */
1804 for (i = 0; i < c->innerclasscount; i++) {
1805 /* Get outer-class. If the inner-class is not a member
1806 class, the outer-class is NULL. */
1808 outer = c->innerclass[i].outer_class;
1810 if (outer.any == NULL)
1813 /* Check if outer-class is a classref or a real class and
1814 get the class name from the structure. */
1816 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1818 /* Outer class is this class. */
1820 if ((outername == c->name) &&
1821 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC)))
1822 declaredclasscount++;
1826 /* Allocate Class[] and check for OOM. */
1828 oa = builtin_anewarray(declaredclasscount, class_java_lang_Class);
1833 for (i = 0, pos = 0; i < c->innerclasscount; i++) {
1834 inner = c->innerclass[i].inner_class;
1835 outer = c->innerclass[i].outer_class;
1837 /* Get outer-class. If the inner-class is not a member class,
1838 the outer-class is NULL. */
1840 if (outer.any == NULL)
1843 /* Check if outer_class is a classref or a real class and get
1844 the class name from the structure. */
1846 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1848 /* Outer class is this class. */
1850 if ((outername == c->name) &&
1851 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC))) {
1853 ic = resolve_classref_or_classinfo_eager(inner, false);
1858 if (!(ic->state & CLASS_LINKED))
1859 if (!link_class(ic))
1862 LLNI_array_direct(oa, pos++) = (java_object_t *) ic;
1870 /* class_get_declaringclass ****************************************************
1872 If the class or interface given is a member of another class,
1873 return the declaring class. For array and primitive classes return
1876 *******************************************************************************/
1878 classinfo *class_get_declaringclass(classinfo *c)
1880 classref_or_classinfo cr;
1883 /* Get declaring class. */
1885 cr = c->declaringclass;
1890 /* Resolve the class if necessary. */
1892 if (IS_CLASSREF(cr)) {
1893 /* dc = resolve_classref_eager(cr.ref); */
1894 dc = resolve_classref_or_classinfo_eager(cr, true);
1899 /* Store the resolved class in the class structure. */
1910 /* class_get_enclosingclass ****************************************************
1912 Return the enclosing class for the given class.
1914 *******************************************************************************/
1916 classinfo *class_get_enclosingclass(classinfo *c)
1918 classref_or_classinfo cr;
1921 /* Get enclosing class. */
1923 cr = c->enclosingclass;
1928 /* Resolve the class if necessary. */
1930 if (IS_CLASSREF(cr)) {
1931 /* ec = resolve_classref_eager(cr.ref); */
1932 ec = resolve_classref_or_classinfo_eager(cr, true);
1937 /* Store the resolved class in the class structure. */
1948 /* class_get_interfaces ********************************************************
1950 Return an array of interfaces of the given class.
1952 *******************************************************************************/
1954 java_handle_objectarray_t *class_get_interfaces(classinfo *c)
1957 java_handle_objectarray_t *oa;
1960 if (!(c->state & CLASS_LINKED))
1964 oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
1969 for (i = 0; i < c->interfacescount; i++) {
1970 ic = c->interfaces[i].cls;
1972 LLNI_array_direct(oa, i) = (java_object_t *) ic;
1979 /* class_get_signature *********************************************************
1981 Return the signature of the given class. For array and primitive
1982 classes return NULL.
1984 *******************************************************************************/
1986 #if defined(ENABLE_JAVASE)
1987 utf *class_get_signature(classinfo *c)
1989 /* For array and primitive classes return NULL. */
1991 if (class_is_array(c) || class_is_primitive(c))
1994 return c->signature;
1999 /* class_printflags ************************************************************
2001 Prints flags of a class.
2003 *******************************************************************************/
2005 #if !defined(NDEBUG)
2006 void class_printflags(classinfo *c)
2013 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
2014 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
2015 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
2016 if (c->flags & ACC_STATIC) printf(" STATIC");
2017 if (c->flags & ACC_FINAL) printf(" FINAL");
2018 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
2019 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
2020 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
2021 if (c->flags & ACC_NATIVE) printf(" NATIVE");
2022 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
2023 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
2028 /* class_print *****************************************************************
2030 Prints classname plus flags.
2032 *******************************************************************************/
2034 #if !defined(NDEBUG)
2035 void class_print(classinfo *c)
2042 utf_display_printable_ascii(c->name);
2043 class_printflags(c);
2048 /* class_classref_print ********************************************************
2050 Prints classname plus referer class.
2052 *******************************************************************************/
2054 #if !defined(NDEBUG)
2055 void class_classref_print(constant_classref *cr)
2062 utf_display_printable_ascii(cr->name);
2065 class_print(cr->referer);
2073 /* class_println ***************************************************************
2075 Prints classname plus flags and new line.
2077 *******************************************************************************/
2079 #if !defined(NDEBUG)
2080 void class_println(classinfo *c)
2088 /* class_classref_println ******************************************************
2090 Prints classname plus referer class and new line.
2092 *******************************************************************************/
2094 #if !defined(NDEBUG)
2095 void class_classref_println(constant_classref *cr)
2097 class_classref_print(cr);
2103 /* class_classref_or_classinfo_print *******************************************
2105 Prints classname plus referer class.
2107 *******************************************************************************/
2109 #if !defined(NDEBUG)
2110 void class_classref_or_classinfo_print(classref_or_classinfo c)
2112 if (c.any == NULL) {
2113 printf("(classref_or_classinfo) NULL");
2117 class_classref_print(c.ref);
2124 /* class_classref_or_classinfo_println *****************************************
2126 Prints classname plus referer class and a newline.
2128 *******************************************************************************/
2130 void class_classref_or_classinfo_println(classref_or_classinfo c)
2132 class_classref_or_classinfo_println(c);
2137 /* class_showconstantpool ******************************************************
2139 Dump the constant pool of the given class to stdout.
2141 *******************************************************************************/
2143 #if !defined(NDEBUG)
2144 void class_showconstantpool (classinfo *c)
2149 printf ("---- dump of constant pool ----\n");
2151 for (i=0; i<c->cpcount; i++) {
2152 printf ("#%d: ", (int) i);
2154 e = c -> cpinfos [i];
2157 switch (c -> cptags [i]) {
2158 case CONSTANT_Class:
2159 printf ("Classreference -> ");
2160 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
2162 case CONSTANT_Fieldref:
2163 printf ("Fieldref -> ");
2164 field_fieldref_print((constant_FMIref *) e);
2166 case CONSTANT_Methodref:
2167 printf ("Methodref -> ");
2168 method_methodref_print((constant_FMIref *) e);
2170 case CONSTANT_InterfaceMethodref:
2171 printf ("InterfaceMethod -> ");
2172 method_methodref_print((constant_FMIref *) e);
2174 case CONSTANT_String:
2175 printf ("String -> ");
2176 utf_display_printable_ascii (e);
2178 case CONSTANT_Integer:
2179 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
2181 case CONSTANT_Float:
2182 printf ("Float -> %f", ((constant_float*)e) -> value);
2184 case CONSTANT_Double:
2185 printf ("Double -> %f", ((constant_double*)e) -> value);
2189 u8 v = ((constant_long*)e) -> value;
2191 printf ("Long -> %ld", (long int) v);
2193 printf ("Long -> HI: %ld, LO: %ld\n",
2194 (long int) v.high, (long int) v.low);
2198 case CONSTANT_NameAndType:
2200 constant_nameandtype *cnt = e;
2201 printf ("NameAndType: ");
2202 utf_display_printable_ascii (cnt->name);
2204 utf_display_printable_ascii (cnt->descriptor);
2208 printf ("Utf8 -> ");
2209 utf_display_printable_ascii (e);
2212 log_text("Invalid type of ConstantPool-Entry");
2220 #endif /* !defined(NDEBUG) */
2223 /* class_showmethods ***********************************************************
2225 Dump info about the fields and methods of the given class to stdout.
2227 *******************************************************************************/
2229 #if !defined(NDEBUG)
2230 void class_showmethods (classinfo *c)
2234 printf("--------- Fields and Methods ----------------\n");
2236 class_printflags(c);
2240 utf_display_printable_ascii(c->name);
2245 utf_display_printable_ascii(c->super.cls->name);
2249 printf("Index: %d\n", c->index);
2251 printf("Interfaces:\n");
2252 for (i = 0; i < c->interfacescount; i++) {
2254 utf_display_printable_ascii(c->interfaces[i].cls->name);
2255 printf (" (%d)\n", c->interfaces[i].cls->index);
2258 printf("Fields:\n");
2259 for (i = 0; i < c->fieldscount; i++)
2260 field_println(&(c->fields[i]));
2262 printf("Methods:\n");
2263 for (i = 0; i < c->methodscount; i++) {
2264 methodinfo *m = &(c->methods[i]);
2266 if (!(m->flags & ACC_STATIC))
2267 printf("vftblindex: %d ", m->vftblindex);
2272 printf ("Virtual function table:\n");
2273 for (i = 0; i < c->vftbl->vftbllength; i++)
2274 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2276 #endif /* !defined(NDEBUG) */
2280 * These are local overrides for various environment variables in Emacs.
2281 * Please do not remove this and leave it at the end of the file, where
2282 * Emacs will automagically detect them.
2283 * ---------------------------------------------------------------------
2286 * indent-tabs-mode: t
2290 * vim:noexpandtab:sw=4:ts=4: