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 8277 2007-08-08 16:42:11Z michi $
41 #include "mm/memory.h"
43 #include "threads/lock-common.h"
45 #include "toolbox/logging.h"
47 #include "vm/exceptions.h"
48 #include "vm/global.h"
49 #include "vm/resolve.h"
51 #include "vm/jit/asmpart.h"
53 #include "vmcore/class.h"
54 #include "vmcore/classcache.h"
55 #include "vmcore/linker.h"
56 #include "vmcore/loader.h"
57 #include "vmcore/options.h"
59 #if defined(ENABLE_STATISTICS)
60 # include "vmcore/statistics.h"
63 #include "vmcore/suck.h"
64 #include "vmcore/utf8.h"
67 /* global variables ***********************************************************/
69 /* frequently used classes ****************************************************/
71 /* important system classes */
73 classinfo *class_java_lang_Object;
74 classinfo *class_java_lang_Class;
75 classinfo *class_java_lang_ClassLoader;
76 classinfo *class_java_lang_Cloneable;
77 classinfo *class_java_lang_SecurityManager;
78 classinfo *class_java_lang_String;
79 classinfo *class_java_lang_System;
80 classinfo *class_java_lang_Thread;
81 classinfo *class_java_lang_ThreadGroup;
82 classinfo *class_java_lang_VMSystem;
83 classinfo *class_java_lang_VMThread;
84 classinfo *class_java_io_Serializable;
86 #if defined(WITH_CLASSPATH_SUN)
87 classinfo *class_sun_reflect_MagicAccessorImpl;
90 /* system exception classes required in cacao */
92 classinfo *class_java_lang_Throwable;
93 classinfo *class_java_lang_Error;
94 classinfo *class_java_lang_LinkageError;
95 classinfo *class_java_lang_NoClassDefFoundError;
96 classinfo *class_java_lang_OutOfMemoryError;
97 classinfo *class_java_lang_VirtualMachineError;
99 #if defined(WITH_CLASSPATH_GNU)
100 classinfo *class_java_lang_VMThrowable;
103 classinfo *class_java_lang_Exception;
104 classinfo *class_java_lang_ClassCastException;
105 classinfo *class_java_lang_ClassNotFoundException;
107 #if defined(ENABLE_JAVASE)
108 classinfo *class_java_lang_Void;
110 classinfo *class_java_lang_Boolean;
111 classinfo *class_java_lang_Byte;
112 classinfo *class_java_lang_Character;
113 classinfo *class_java_lang_Short;
114 classinfo *class_java_lang_Integer;
115 classinfo *class_java_lang_Long;
116 classinfo *class_java_lang_Float;
117 classinfo *class_java_lang_Double;
120 /* some runtime exception */
122 classinfo *class_java_lang_NullPointerException;
125 /* some classes which may be used more often */
127 #if defined(ENABLE_JAVASE)
128 classinfo *class_java_lang_StackTraceElement;
129 classinfo *class_java_lang_reflect_Constructor;
130 classinfo *class_java_lang_reflect_Field;
131 classinfo *class_java_lang_reflect_Method;
132 classinfo *class_java_security_PrivilegedAction;
133 classinfo *class_java_util_Vector;
135 classinfo *arrayclass_java_lang_Object;
137 #if defined(ENABLE_ANNOTATIONS)
138 classinfo *class_sun_reflect_ConstantPool;
139 classinfo *class_sun_reflect_annotation_AnnotationParser;
144 /* pseudo classes for the typechecker */
146 classinfo *pseudo_class_Arraystub;
147 classinfo *pseudo_class_Null;
148 classinfo *pseudo_class_New;
151 /* class_set_packagename *******************************************************
153 Derive the package name from the class name and store it in the struct.
155 *******************************************************************************/
157 void class_set_packagename(classinfo *c)
159 char *p = UTF_END(c->name) - 1;
160 char *start = c->name->text;
162 /* set the package name */
163 /* classes in the unnamed package keep packagename == NULL */
165 if (c->name->text[0] == '[') {
166 /* set packagename of arrays to the element's package */
168 for (; *start == '['; start++);
170 /* skip the 'L' in arrays of references */
174 for (; (p > start) && (*p != '/'); --p);
176 c->packagename = utf_new(start, p - start);
179 for (; (p > start) && (*p != '/'); --p);
181 c->packagename = utf_new(start, p - start);
186 /* class_create_classinfo ******************************************************
188 Create a new classinfo struct. The class name is set to the given utf *,
189 most other fields are initialized to zero.
191 Note: classname may be NULL. In this case a not-yet-named classinfo is
192 created. The name must be filled in later and class_set_packagename
193 must be called after that.
195 *******************************************************************************/
197 classinfo *class_create_classinfo(utf *classname)
201 #if defined(ENABLE_STATISTICS)
203 size_classinfo += sizeof(classinfo);
206 /* we use a safe name for temporarily unnamed classes */
208 if (classname == NULL)
209 classname = utf_not_named_yet;
213 log_message_utf("Creating class: ", classname);
216 /* GCNEW_UNCOLLECTABLE clears the allocated memory */
218 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
219 /*c=NEW(classinfo);*/
222 /* Set the header.vftbl of all loaded classes to the one of
223 java.lang.Class, so Java code can use a class as object. */
225 if (class_java_lang_Class != NULL)
226 if (class_java_lang_Class->vftbl != NULL)
227 c->object.header.vftbl = class_java_lang_Class->vftbl;
229 #if defined(ENABLE_JAVASE)
230 /* check if the class is a reference class and flag it */
232 if (classname == utf_java_lang_ref_SoftReference) {
233 c->flags |= ACC_CLASS_REFERENCE_SOFT;
235 else if (classname == utf_java_lang_ref_WeakReference) {
236 c->flags |= ACC_CLASS_REFERENCE_WEAK;
238 else if (classname == utf_java_lang_ref_PhantomReference) {
239 c->flags |= ACC_CLASS_REFERENCE_PHANTOM;
243 if (classname != utf_not_named_yet)
244 class_set_packagename(c);
246 LOCK_INIT_OBJECT_LOCK(&c->object.header);
252 /* class_postset_header_vftbl **************************************************
254 Set the header.vftbl of all classes created before java.lang.Class
255 was linked. This is necessary that Java code can use a class as
258 *******************************************************************************/
260 void class_postset_header_vftbl(void)
264 classcache_name_entry *nmen;
265 classcache_class_entry *clsen;
267 assert(class_java_lang_Class);
269 for (slot = 0; slot < hashtable_classcache.size; slot++) {
270 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
272 for (; nmen; nmen = nmen->hashlink) {
273 /* iterate over all class entries */
275 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
278 /* now set the the vftbl */
280 if (c->object.header.vftbl == NULL)
281 c->object.header.vftbl = class_java_lang_Class->vftbl;
287 /* class_define ****************************************************************
289 Calls the loader and defines a class in the VM.
291 *******************************************************************************/
293 classinfo *class_define(utf *name, java_objectheader *cl, int32_t length, const uint8_t *data)
300 /* check if this class has already been defined */
302 c = classcache_lookup_defined_or_initiated(cl, name);
305 exceptions_throw_linkageerror("duplicate class definition: ", c);
310 /* create a new classinfo struct */
312 c = class_create_classinfo(name);
314 #if defined(ENABLE_STATISTICS)
317 if (opt_getloadingtime)
321 /* build a classbuffer with the given data */
323 cb = NEW(classbuffer);
330 /* preset the defining classloader */
334 /* load the class from this buffer */
336 r = load_class_from_classbuffer(cb);
340 FREE(cb, classbuffer);
342 #if defined(ENABLE_STATISTICS)
345 if (opt_getloadingtime)
350 /* If return value is NULL, we had a problem and the class is
351 not loaded. Now free the allocated memory, otherwise we
352 could run into a DOS. */
359 /* Store the newly defined class in the class cache. This call
360 also checks whether a class of the same name has already been
361 defined by the same defining loader, and if so, replaces the
362 newly created class by the one defined earlier. */
364 /* Important: The classinfo given to classcache_store must be
365 fully prepared because another thread may return
366 this pointer after the lookup at to top of this
367 function directly after the class cache lock has
370 c = classcache_store(cl, c, true);
376 /* class_load_attribute_sourcefile *********************************************
378 SourceFile_attribute {
379 u2 attribute_name_index;
384 *******************************************************************************/
386 static bool class_load_attribute_sourcefile(classbuffer *cb)
397 /* check buffer size */
399 if (!suck_check_classbuffer_size(cb, 4 + 2))
402 /* check attribute length */
404 attribute_length = suck_u4(cb);
406 if (attribute_length != 2) {
407 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
411 /* there can be no more than one SourceFile attribute */
413 if (c->sourcefile != NULL) {
414 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
420 sourcefile_index = suck_u2(cb);
421 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
423 if (sourcefile == NULL)
426 /* store sourcefile */
428 c->sourcefile = sourcefile;
434 /* class_load_attribute_enclosingmethod ****************************************
436 EnclosingMethod_attribute {
437 u2 attribute_name_index;
443 *******************************************************************************/
445 #if defined(ENABLE_JAVASE)
446 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
452 classref_or_classinfo cr;
453 constant_nameandtype *cn;
459 /* check buffer size */
461 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
464 /* check attribute length */
466 attribute_length = suck_u4(cb);
468 if (attribute_length != 4) {
469 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
473 /* there can be no more than one EnclosingMethod attribute */
475 if (c->enclosingmethod != NULL) {
476 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
480 /* get class index */
482 class_index = suck_u2(cb);
483 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
485 /* get method index */
487 method_index = suck_u2(cb);
488 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
490 /* store info in classinfo */
492 c->enclosingclass.any = cr.any;
493 c->enclosingmethod = cn;
497 #endif /* defined(ENABLE_JAVASE) */
500 /* class_load_attributes *******************************************************
502 Read attributes from ClassFile.
505 u2 attribute_name_index;
507 u1 info[attribute_length];
510 InnerClasses_attribute {
511 u2 attribute_name_index;
515 *******************************************************************************/
517 bool class_load_attributes(classbuffer *cb)
522 u2 attribute_name_index;
527 /* get attributes count */
529 if (!suck_check_classbuffer_size(cb, 2))
532 attributes_count = suck_u2(cb);
534 for (i = 0; i < attributes_count; i++) {
535 /* get attribute name */
537 if (!suck_check_classbuffer_size(cb, 2))
540 attribute_name_index = suck_u2(cb);
542 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
544 if (attribute_name == NULL)
547 if (attribute_name == utf_InnerClasses) {
550 if (c->innerclass != NULL) {
551 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
555 if (!suck_check_classbuffer_size(cb, 4 + 2))
558 /* skip attribute length */
561 /* number of records */
562 c->innerclasscount = suck_u2(cb);
564 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
567 /* allocate memory for innerclass structure */
568 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
570 for (j = 0; j < c->innerclasscount; j++) {
571 /* The innerclass structure contains a class with an encoded
572 name, its defining scope, its simple name and a bitmask of
573 the access flags. If an inner class is not a member, its
574 outer_class is NULL, if a class is anonymous, its name is
577 innerclassinfo *info = c->innerclass + j;
579 info->inner_class.ref =
580 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
581 info->outer_class.ref =
582 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
584 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
585 info->flags = suck_u2(cb);
588 else if (attribute_name == utf_SourceFile) {
591 if (!class_load_attribute_sourcefile(cb))
594 #if defined(ENABLE_JAVASE)
595 else if (attribute_name == utf_EnclosingMethod) {
596 /* EnclosingMethod */
598 if (!class_load_attribute_enclosingmethod(cb))
601 else if (attribute_name == utf_Signature) {
604 if (!loader_load_attribute_signature(cb, &(c->signature)))
609 #if defined(ENABLE_ANNOTATIONS)
610 /* XXX We can't do a release with that enabled */
612 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
613 /* RuntimeVisibleAnnotations */
614 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
617 /* XXX RuntimeInvisibleAnnotations should only be loaded
618 * (or returned to Java) if some commandline options says so.
619 * Currently there is no such option available in cacao,
620 * therefore I load them allways (for testing purpose).
621 * Anyway, bytecode for RuntimeInvisibleAnnotations is only
622 * generated if you tell javac to do so. So in most cases
623 * there won't be any.
625 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
626 /* RuntimeInvisibleAnnotations */
627 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
633 /* unknown attribute */
635 if (!loader_skip_attribute_body(cb))
644 /* class_freepool **************************************************************
646 Frees all resources used by this classes Constant Pool.
648 *******************************************************************************/
650 static void class_freecpool(classinfo *c)
656 if (c->cptags && c->cpinfos) {
657 for (idx = 0; idx < c->cpcount; idx++) {
658 tag = c->cptags[idx];
659 info = c->cpinfos[idx];
663 case CONSTANT_Fieldref:
664 case CONSTANT_Methodref:
665 case CONSTANT_InterfaceMethodref:
666 FREE(info, constant_FMIref);
668 case CONSTANT_Integer:
669 FREE(info, constant_integer);
672 FREE(info, constant_float);
675 FREE(info, constant_long);
677 case CONSTANT_Double:
678 FREE(info, constant_double);
680 case CONSTANT_NameAndType:
681 FREE(info, constant_nameandtype);
689 MFREE(c->cptags, u1, c->cpcount);
692 MFREE(c->cpinfos, voidptr, c->cpcount);
696 /* class_getconstant ***********************************************************
698 Retrieves the value at position 'pos' of the constantpool of a
699 class. If the type of the value is other than 'ctype', an error is
702 *******************************************************************************/
704 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
706 /* check index and type of constantpool entry */
707 /* (pos == 0 is caught by type comparison) */
709 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
710 exceptions_throw_classformaterror(c, "Illegal constant pool index");
714 return c->cpinfos[pos];
718 /* innerclass_getconstant ******************************************************
720 Like class_getconstant, but if cptags is ZERO, null is returned.
722 *******************************************************************************/
724 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
726 /* invalid position in constantpool */
728 if (pos >= c->cpcount) {
729 exceptions_throw_classformaterror(c, "Illegal constant pool index");
733 /* constantpool entry of type 0 */
735 if (c->cptags[pos] == 0)
738 /* check type of constantpool entry */
740 if (c->cptags[pos] != ctype) {
741 exceptions_throw_classformaterror(c, "Illegal constant pool index");
745 return c->cpinfos[pos];
749 /* class_free ******************************************************************
751 Frees all resources used by the class.
753 *******************************************************************************/
755 void class_free(classinfo *c)
763 MFREE(c->interfaces, classinfo*, c->interfacescount);
766 for (i = 0; i < c->fieldscount; i++)
767 field_free(&(c->fields[i]));
768 #if defined(ENABLE_CACAO_GC)
769 MFREE(c->fields, fieldinfo, c->fieldscount);
774 for (i = 0; i < c->methodscount; i++)
775 method_free(&(c->methods[i]));
776 MFREE(c->methods, methodinfo, c->methodscount);
779 if ((v = c->vftbl) != NULL) {
781 mem_free(v->arraydesc,sizeof(arraydescriptor));
783 for (i = 0; i < v->interfacetablelength; i++) {
784 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
786 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
788 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
789 sizeof(methodptr*) * (v->interfacetablelength -
790 (v->interfacetablelength > 0));
791 v = (vftbl_t*) (((methodptr*) v) -
792 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
797 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
799 /* if (c->classvftbl)
800 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
804 #if defined(ENABLE_ANNOTATIONS)
805 annotation_bytearray_free(c->annotations);
807 annotation_bytearrays_free(c->method_annotations);
808 annotation_bytearrays_free(c->method_parameterannotations);
809 annotation_bytearrays_free(c->method_annotationdefaults);
811 annotation_bytearrays_free(c->field_annotations);
816 /* get_array_class *************************************************************
818 Returns the array class with the given name for the given
819 classloader, or NULL if an exception occurred.
821 Note: This function does eager loading.
823 *******************************************************************************/
825 static classinfo *get_array_class(utf *name,java_objectheader *initloader,
826 java_objectheader *defloader,bool link)
830 /* lookup this class in the classcache */
831 c = classcache_lookup(initloader,name);
833 c = classcache_lookup_defined(defloader,name);
836 /* we have to create it */
837 c = class_create_classinfo(name);
838 c = load_newly_created_array(c,initloader);
844 assert(c->state & CLASS_LOADED);
845 assert(c->classloader == defloader);
847 if (link && !(c->state & CLASS_LINKED))
851 assert(!link || (c->state & CLASS_LINKED));
857 /* class_array_of **************************************************************
859 Returns an array class with the given component class. The array
860 class is dynamically created if neccessary.
862 *******************************************************************************/
864 classinfo *class_array_of(classinfo *component, bool link)
866 java_objectheader *cl;
873 cl = component->classloader;
875 dumpsize = dump_size();
877 /* Assemble the array class name */
878 namelen = component->name->blength;
880 if (component->name->text[0] == '[') {
881 /* the component is itself an array */
882 namebuf = DMNEW(char, namelen + 1);
884 MCOPY(namebuf + 1, component->name->text, char, namelen);
888 /* the component is a non-array class */
889 namebuf = DMNEW(char, namelen + 3);
892 MCOPY(namebuf + 2, component->name->text, char, namelen);
893 namebuf[2 + namelen] = ';';
897 u = utf_new(namebuf, namelen);
899 c = get_array_class(u, cl, cl, link);
901 dump_release(dumpsize);
907 /* class_multiarray_of *********************************************************
909 Returns an array class with the given dimension and element class.
910 The array class is dynamically created if neccessary.
912 *******************************************************************************/
914 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
921 dumpsize = dump_size();
924 log_text("Invalid array dimension requested");
928 /* Assemble the array class name */
929 namelen = element->name->blength;
931 if (element->name->text[0] == '[') {
932 /* the element is itself an array */
933 namebuf = DMNEW(char, namelen + dim);
934 memcpy(namebuf + dim, element->name->text, namelen);
938 /* the element is a non-array class */
939 namebuf = DMNEW(char, namelen + 2 + dim);
941 memcpy(namebuf + dim + 1, element->name->text, namelen);
942 namelen += (2 + dim);
943 namebuf[namelen - 1] = ';';
945 memset(namebuf, '[', dim);
947 c = get_array_class(utf_new(namebuf, namelen),
948 element->classloader,
949 element->classloader,
952 dump_release(dumpsize);
958 /* class_lookup_classref *******************************************************
960 Looks up the constant_classref for a given classname in the classref
964 cls..............the class containing the reference
965 name.............the name of the class refered to
968 a pointer to a constant_classref, or
969 NULL if the reference was not found
971 *******************************************************************************/
973 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
975 constant_classref *ref;
976 extra_classref *xref;
981 assert(!cls->classrefcount || cls->classrefs);
983 /* first search the main classref table */
984 count = cls->classrefcount;
985 ref = cls->classrefs;
986 for (; count; --count, ++ref)
987 if (ref->name == name)
990 /* next try the list of extra classrefs */
991 for (xref = cls->extclassrefs; xref; xref = xref->next) {
992 if (xref->classref.name == name)
993 return &(xref->classref);
1001 /* class_get_classref **********************************************************
1003 Returns the constant_classref for a given classname.
1006 cls..............the class containing the reference
1007 name.............the name of the class refered to
1010 a pointer to a constant_classref (never NULL)
1013 The given name is not checked for validity!
1015 *******************************************************************************/
1017 constant_classref *class_get_classref(classinfo *cls, utf *name)
1019 constant_classref *ref;
1020 extra_classref *xref;
1025 ref = class_lookup_classref(cls,name);
1029 xref = NEW(extra_classref);
1030 CLASSREF_INIT(xref->classref,cls,name);
1032 xref->next = cls->extclassrefs;
1033 cls->extclassrefs = xref;
1035 return &(xref->classref);
1039 /* class_get_self_classref *****************************************************
1041 Returns the constant_classref to the class itself.
1044 cls..............the class containing the reference
1047 a pointer to a constant_classref (never NULL)
1049 *******************************************************************************/
1051 constant_classref *class_get_self_classref(classinfo *cls)
1053 /* XXX this should be done in a faster way. Maybe always make */
1054 /* the classref of index 0 a self reference. */
1055 return class_get_classref(cls,cls->name);
1058 /* class_get_classref_multiarray_of ********************************************
1060 Returns an array type reference with the given dimension and element class
1064 dim..............the requested dimension
1065 dim must be in [1;255]. This is NOT checked!
1066 ref..............the component class reference
1069 a pointer to the class reference for the array type
1072 The referer of `ref` is used as the referer for the new classref.
1074 *******************************************************************************/
1076 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1081 constant_classref *cr;
1084 assert(dim >= 1 && dim <= 255);
1086 dumpsize = dump_size();
1088 /* Assemble the array class name */
1089 namelen = ref->name->blength;
1091 if (ref->name->text[0] == '[') {
1092 /* the element is itself an array */
1093 namebuf = DMNEW(char, namelen + dim);
1094 memcpy(namebuf + dim, ref->name->text, namelen);
1098 /* the element is a non-array class */
1099 namebuf = DMNEW(char, namelen + 2 + dim);
1101 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1102 namelen += (2 + dim);
1103 namebuf[namelen - 1] = ';';
1105 memset(namebuf, '[', dim);
1107 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1109 dump_release(dumpsize);
1115 /* class_get_classref_component_of *********************************************
1117 Returns the component classref of a given array type reference
1120 ref..............the array type reference
1123 a reference to the component class, or
1124 NULL if `ref` is not an object array type reference
1127 The referer of `ref` is used as the referer for the new classref.
1129 *******************************************************************************/
1131 constant_classref *class_get_classref_component_of(constant_classref *ref)
1138 name = ref->name->text;
1142 namelen = ref->name->blength - 1;
1147 else if (*name != '[') {
1151 return class_get_classref(ref->referer, utf_new(name, namelen));
1155 /* class_findmethod ************************************************************
1157 Searches a 'classinfo' structure for a method having the given name
1158 and descriptor. If descriptor is NULL, it is ignored.
1160 *******************************************************************************/
1162 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1167 for (i = 0; i < c->methodscount; i++) {
1168 m = &(c->methods[i]);
1170 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1178 /* class_resolvemethod *********************************************************
1180 Searches a class and it's super classes for a method.
1182 Superinterfaces are *not* searched.
1184 *******************************************************************************/
1186 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1191 m = class_findmethod(c, name, desc);
1196 /* JVM Specification bug:
1198 It is important NOT to resolve special <init> and <clinit>
1199 methods to super classes or interfaces; yet, this is not
1200 explicited in the specification. Section 5.4.3.3 should be
1201 updated appropriately. */
1203 if (name == utf_init || name == utf_clinit)
1213 /* class_resolveinterfacemethod_intern *****************************************
1215 Internally used helper function. Do not use this directly.
1217 *******************************************************************************/
1219 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1220 utf *name, utf *desc)
1225 /* try to find the method in the class */
1227 m = class_findmethod(c, name, desc);
1232 /* no method found? try the superinterfaces */
1234 for (i = 0; i < c->interfacescount; i++) {
1235 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1242 /* no method found */
1248 /* class_resolveclassmethod ****************************************************
1250 Resolves a reference from REFERER to a method with NAME and DESC in
1253 If the method cannot be resolved the return value is NULL. If
1254 EXCEPT is true *exceptionptr is set, too.
1256 *******************************************************************************/
1258 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1259 classinfo *referer, bool throwexception)
1265 /* if (c->flags & ACC_INTERFACE) { */
1266 /* if (throwexception) */
1267 /* *exceptionptr = */
1268 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1272 /* try class c and its superclasses */
1276 m = class_resolvemethod(cls, name, desc);
1281 /* try the superinterfaces */
1283 for (i = 0; i < c->interfacescount; i++) {
1284 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1292 exceptions_throw_nosuchmethoderror(c, name, desc);
1297 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1299 exceptions_throw_abstractmethoderror();
1304 /* XXX check access rights */
1310 /* class_resolveinterfacemethod ************************************************
1312 Resolves a reference from REFERER to a method with NAME and DESC in
1315 If the method cannot be resolved the return value is NULL. If
1316 EXCEPT is true *exceptionptr is set, too.
1318 *******************************************************************************/
1320 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1321 classinfo *referer, bool throwexception)
1325 if (!(c->flags & ACC_INTERFACE)) {
1327 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1332 mi = class_resolveinterfacemethod_intern(c, name, desc);
1337 /* try class java.lang.Object */
1339 mi = class_findmethod(class_java_lang_Object, name, desc);
1345 exceptions_throw_nosuchmethoderror(c, name, desc);
1351 /* class_findfield *************************************************************
1353 Searches for field with specified name and type in a classinfo
1354 structure. If no such field is found NULL is returned.
1356 *******************************************************************************/
1358 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1362 for (i = 0; i < c->fieldscount; i++)
1363 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1364 return &(c->fields[i]);
1367 return class_findfield(c->super.cls, name, desc);
1373 /* class_findfield_approx ******************************************************
1375 Searches in 'classinfo'-structure for a field with the specified
1378 *******************************************************************************/
1380 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1384 /* get field index */
1386 i = class_findfield_index_by_name(c, name);
1388 /* field was not found, return */
1393 /* return field address */
1395 return &(c->fields[i]);
1399 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1403 for (i = 0; i < c->fieldscount; i++) {
1404 /* compare field names */
1406 if ((c->fields[i].name == name))
1410 /* field was not found, raise exception */
1412 exceptions_throw_nosuchfielderror(c, name);
1418 /****************** Function: class_resolvefield_int ***************************
1420 This is an internally used helper function. Do not use this directly.
1422 Tries to resolve a field having the given name and type.
1423 If the field cannot be resolved, NULL is returned.
1425 *******************************************************************************/
1427 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1432 /* search for field in class c */
1434 for (i = 0; i < c->fieldscount; i++) {
1435 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1436 return &(c->fields[i]);
1440 /* try superinterfaces recursively */
1442 for (i = 0; i < c->interfacescount; i++) {
1443 fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
1448 /* try superclass */
1451 return class_resolvefield_int(c->super.cls, name, desc);
1459 /********************* Function: class_resolvefield ***************************
1461 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1463 If the field cannot be resolved the return value is NULL. If EXCEPT is
1464 true *exceptionptr is set, too.
1466 *******************************************************************************/
1468 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1469 classinfo *referer, bool throwexception)
1473 fi = class_resolvefield_int(c, name, desc);
1477 exceptions_throw_nosuchfielderror(c, name);
1482 /* XXX check access rights */
1488 /* class_resolve_superclass ****************************************************
1490 Resolves the super class reference of the given class if necessary.
1492 *******************************************************************************/
1494 static classinfo *class_resolve_superclass(classinfo *c)
1498 if (c->super.any == NULL)
1501 /* Do we have a super class reference or is it already
1504 if (IS_CLASSREF(c->super)) {
1505 super = resolve_classref_or_classinfo_eager(c->super, true);
1510 /* Store the resolved super class in the class structure. */
1512 c->super.cls = super;
1515 return c->super.cls;
1519 /* class_issubclass ************************************************************
1521 Checks if sub is a descendant of super.
1523 *******************************************************************************/
1525 bool class_issubclass(classinfo *sub, classinfo *super)
1534 sub = class_resolve_superclass(sub);
1539 /* class_isanysubclass *********************************************************
1541 Checks a subclass relation between two classes. Implemented
1542 interfaces are interpreted as super classes.
1544 Return value: 1 ... sub is subclass of super
1547 *******************************************************************************/
1549 bool class_isanysubclass(classinfo *sub, classinfo *super)
1554 /* This is the trivial case. */
1559 /* Primitive classes are only subclasses of themselves. */
1561 if (class_is_primitive(sub) || class_is_primitive(super))
1564 /* Check for interfaces. */
1566 if (super->flags & ACC_INTERFACE) {
1567 result = (sub->vftbl->interfacetablelength > super->index) &&
1568 (sub->vftbl->interfacetable[-super->index] != NULL);
1571 /* java.lang.Object is the only super class of any
1574 if (sub->flags & ACC_INTERFACE)
1575 return (super == class_java_lang_Object);
1577 LOCK_MONITOR_ENTER(linker_classrenumber_lock);
1579 diffval = sub->vftbl->baseval - super->vftbl->baseval;
1580 result = diffval <= (uint32_t) super->vftbl->diffval;
1582 LOCK_MONITOR_EXIT(linker_classrenumber_lock);
1589 /* class_is_primitive **********************************************************
1591 Checks if the given class is a primitive class.
1593 *******************************************************************************/
1595 bool class_is_primitive(classinfo *c)
1597 if (c->flags & ACC_CLASS_PRIMITIVE)
1604 /* class_is_array **************************************************************
1606 Checks if the given class is an array class.
1608 *******************************************************************************/
1610 bool class_is_array(classinfo *c)
1612 if (!(c->state & CLASS_LINKED))
1616 return (c->vftbl->arraydesc != NULL);
1620 /* class_is_interface **********************************************************
1622 Checks if the given class is an interface.
1624 *******************************************************************************/
1626 bool class_is_interface(classinfo *c)
1628 if (c->flags & ACC_INTERFACE)
1635 /* class_get_superclass ********************************************************
1637 Return the super class of the given class. If the super-field is a
1638 class-reference, resolve it and store it in the classinfo.
1640 *******************************************************************************/
1642 classinfo *class_get_superclass(classinfo *c)
1646 /* For java.lang.Object, primitive and Void classes we return
1649 if (c->super.any == NULL)
1652 /* For interfaces we also return NULL. */
1654 if (c->flags & ACC_INTERFACE)
1657 /* We may have to resolve the super class reference. */
1659 super = class_resolve_superclass(c);
1665 /* class_get_declaringclass ****************************************************
1667 If the class or interface given is a member of another class,
1668 return the declaring class. For array and primitive classes return
1671 *******************************************************************************/
1673 classinfo *class_get_declaringclass(classinfo *c)
1675 classref_or_classinfo innercr;
1677 classref_or_classinfo outercr;
1681 /* return NULL for arrayclasses and primitive classes */
1683 if (class_is_primitive(c) || (c->name->text[0] == '['))
1686 /* no innerclasses exist */
1688 if (c->innerclasscount == 0)
1691 for (i = 0; i < c->innerclasscount; i++) {
1692 /* Check if inner_class is a classref or a real class and get
1693 the class name from the structure. */
1695 innercr = c->innerclass[i].inner_class;
1697 innername = IS_CLASSREF(innercr) ?
1698 innercr.ref->name : innercr.cls->name;
1700 /* Is the current innerclass this class? */
1702 if (innername == c->name) {
1703 /* Maybe the outer class is not loaded yet. */
1705 outercr = c->innerclass[i].outer_class;
1707 outer = resolve_classref_or_classinfo_eager(outercr, false);
1712 if (!(outer->state & CLASS_LINKED))
1713 if (!link_class(outer))
1724 /* class_get_signature *********************************************************
1726 Return the signature of the given class. For array and primitive
1727 classes return NULL.
1729 *******************************************************************************/
1731 #if defined(ENABLE_JAVASE)
1732 utf *class_get_signature(classinfo *c)
1734 /* For array and primitive classes return NULL. */
1736 if (class_is_array(c) || class_is_primitive(c))
1739 return c->signature;
1744 /* class_printflags ************************************************************
1746 Prints flags of a class.
1748 *******************************************************************************/
1750 #if !defined(NDEBUG)
1751 void class_printflags(classinfo *c)
1758 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
1759 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
1760 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
1761 if (c->flags & ACC_STATIC) printf(" STATIC");
1762 if (c->flags & ACC_FINAL) printf(" FINAL");
1763 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
1764 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
1765 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
1766 if (c->flags & ACC_NATIVE) printf(" NATIVE");
1767 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
1768 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
1773 /* class_print *****************************************************************
1775 Prints classname plus flags.
1777 *******************************************************************************/
1779 #if !defined(NDEBUG)
1780 void class_print(classinfo *c)
1787 utf_display_printable_ascii(c->name);
1788 class_printflags(c);
1793 /* class_classref_print ********************************************************
1795 Prints classname plus referer class.
1797 *******************************************************************************/
1799 #if !defined(NDEBUG)
1800 void class_classref_print(constant_classref *cr)
1807 utf_display_printable_ascii(cr->name);
1810 class_print(cr->referer);
1818 /* class_println ***************************************************************
1820 Prints classname plus flags and new line.
1822 *******************************************************************************/
1824 #if !defined(NDEBUG)
1825 void class_println(classinfo *c)
1833 /* class_classref_println ******************************************************
1835 Prints classname plus referer class and new line.
1837 *******************************************************************************/
1839 #if !defined(NDEBUG)
1840 void class_classref_println(constant_classref *cr)
1842 class_classref_print(cr);
1848 /* class_classref_or_classinfo_print *******************************************
1850 Prints classname plus referer class.
1852 *******************************************************************************/
1854 #if !defined(NDEBUG)
1855 void class_classref_or_classinfo_print(classref_or_classinfo c)
1857 if (c.any == NULL) {
1858 printf("(classref_or_classinfo) NULL");
1862 class_classref_print(c.ref);
1869 /* class_classref_or_classinfo_println *****************************************
1871 Prints classname plus referer class and a newline.
1873 *******************************************************************************/
1875 void class_classref_or_classinfo_println(classref_or_classinfo c)
1877 class_classref_or_classinfo_println(c);
1882 /* class_showconstantpool ******************************************************
1884 Dump the constant pool of the given class to stdout.
1886 *******************************************************************************/
1888 #if !defined(NDEBUG)
1889 void class_showconstantpool (classinfo *c)
1894 printf ("---- dump of constant pool ----\n");
1896 for (i=0; i<c->cpcount; i++) {
1897 printf ("#%d: ", (int) i);
1899 e = c -> cpinfos [i];
1902 switch (c -> cptags [i]) {
1903 case CONSTANT_Class:
1904 printf ("Classreference -> ");
1905 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
1907 case CONSTANT_Fieldref:
1908 printf ("Fieldref -> ");
1909 field_fieldref_print((constant_FMIref *) e);
1911 case CONSTANT_Methodref:
1912 printf ("Methodref -> ");
1913 method_methodref_print((constant_FMIref *) e);
1915 case CONSTANT_InterfaceMethodref:
1916 printf ("InterfaceMethod -> ");
1917 method_methodref_print((constant_FMIref *) e);
1919 case CONSTANT_String:
1920 printf ("String -> ");
1921 utf_display_printable_ascii (e);
1923 case CONSTANT_Integer:
1924 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
1926 case CONSTANT_Float:
1927 printf ("Float -> %f", ((constant_float*)e) -> value);
1929 case CONSTANT_Double:
1930 printf ("Double -> %f", ((constant_double*)e) -> value);
1934 u8 v = ((constant_long*)e) -> value;
1936 printf ("Long -> %ld", (long int) v);
1938 printf ("Long -> HI: %ld, LO: %ld\n",
1939 (long int) v.high, (long int) v.low);
1943 case CONSTANT_NameAndType:
1945 constant_nameandtype *cnt = e;
1946 printf ("NameAndType: ");
1947 utf_display_printable_ascii (cnt->name);
1949 utf_display_printable_ascii (cnt->descriptor);
1953 printf ("Utf8 -> ");
1954 utf_display_printable_ascii (e);
1957 log_text("Invalid type of ConstantPool-Entry");
1965 #endif /* !defined(NDEBUG) */
1968 /* class_showmethods ***********************************************************
1970 Dump info about the fields and methods of the given class to stdout.
1972 *******************************************************************************/
1974 #if !defined(NDEBUG)
1975 void class_showmethods (classinfo *c)
1979 printf("--------- Fields and Methods ----------------\n");
1981 class_printflags(c);
1985 utf_display_printable_ascii(c->name);
1990 utf_display_printable_ascii(c->super.cls->name);
1994 printf("Index: %d\n", c->index);
1996 printf("Interfaces:\n");
1997 for (i = 0; i < c->interfacescount; i++) {
1999 utf_display_printable_ascii(c->interfaces[i].cls->name);
2000 printf (" (%d)\n", c->interfaces[i].cls->index);
2003 printf("Fields:\n");
2004 for (i = 0; i < c->fieldscount; i++)
2005 field_println(&(c->fields[i]));
2007 printf("Methods:\n");
2008 for (i = 0; i < c->methodscount; i++) {
2009 methodinfo *m = &(c->methods[i]);
2011 if (!(m->flags & ACC_STATIC))
2012 printf("vftblindex: %d ", m->vftblindex);
2017 printf ("Virtual function table:\n");
2018 for (i = 0; i < c->vftbl->vftbllength; i++)
2019 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2021 #endif /* !defined(NDEBUG) */
2025 * These are local overrides for various environment variables in Emacs.
2026 * Please do not remove this and leave it at the end of the file, where
2027 * Emacs will automagically detect them.
2028 * ---------------------------------------------------------------------
2031 * indent-tabs-mode: t
2035 * vim:noexpandtab:sw=4:ts=4: