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 8056 2007-06-10 14:49:57Z 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"
50 #include "vm/jit/asmpart.h"
52 #include "vmcore/class.h"
53 #include "vmcore/classcache.h"
54 #include "vmcore/loader.h"
55 #include "vmcore/options.h"
57 #if defined(ENABLE_STATISTICS)
58 # include "vmcore/statistics.h"
61 #include "vmcore/suck.h"
62 #include "vmcore/utf8.h"
65 /* global variables ***********************************************************/
67 list_t unlinkedclasses; /* this is only used for eager class */
71 /* frequently used classes ****************************************************/
73 /* important system classes */
75 classinfo *class_java_lang_Object;
76 classinfo *class_java_lang_Class;
77 classinfo *class_java_lang_ClassLoader;
78 classinfo *class_java_lang_Cloneable;
79 classinfo *class_java_lang_SecurityManager;
80 classinfo *class_java_lang_String;
81 classinfo *class_java_lang_System;
82 classinfo *class_java_lang_Thread;
83 classinfo *class_java_lang_ThreadGroup;
84 classinfo *class_java_lang_VMSystem;
85 classinfo *class_java_lang_VMThread;
86 classinfo *class_java_io_Serializable;
89 /* system exception classes required in cacao */
91 classinfo *class_java_lang_Throwable;
92 classinfo *class_java_lang_Error;
93 classinfo *class_java_lang_LinkageError;
94 classinfo *class_java_lang_NoClassDefFoundError;
95 classinfo *class_java_lang_OutOfMemoryError;
96 classinfo *class_java_lang_VirtualMachineError;
98 #if defined(WITH_CLASSPATH_GNU)
99 classinfo *class_java_lang_VMThrowable;
102 classinfo *class_java_lang_Exception;
103 classinfo *class_java_lang_ClassCastException;
104 classinfo *class_java_lang_ClassNotFoundException;
106 #if defined(ENABLE_JAVASE)
107 classinfo *class_java_lang_Void;
109 classinfo *class_java_lang_Boolean;
110 classinfo *class_java_lang_Byte;
111 classinfo *class_java_lang_Character;
112 classinfo *class_java_lang_Short;
113 classinfo *class_java_lang_Integer;
114 classinfo *class_java_lang_Long;
115 classinfo *class_java_lang_Float;
116 classinfo *class_java_lang_Double;
119 /* some runtime exception */
121 classinfo *class_java_lang_NullPointerException;
124 /* some classes which may be used more often */
126 #if defined(ENABLE_JAVASE)
127 classinfo *class_java_lang_StackTraceElement;
128 classinfo *class_java_lang_reflect_Constructor;
129 classinfo *class_java_lang_reflect_Field;
130 classinfo *class_java_lang_reflect_Method;
131 classinfo *class_java_security_PrivilegedAction;
132 classinfo *class_java_util_Vector;
134 classinfo *arrayclass_java_lang_Object;
138 /* pseudo classes for the typechecker */
140 classinfo *pseudo_class_Arraystub;
141 classinfo *pseudo_class_Null;
142 classinfo *pseudo_class_New;
145 /* class_set_packagename *******************************************************
147 Derive the package name from the class name and store it in the struct.
149 *******************************************************************************/
151 void class_set_packagename(classinfo *c)
153 char *p = UTF_END(c->name) - 1;
154 char *start = c->name->text;
156 /* set the package name */
157 /* classes in the unnamed package keep packagename == NULL */
159 if (c->name->text[0] == '[') {
160 /* set packagename of arrays to the element's package */
162 for (; *start == '['; start++);
164 /* skip the 'L' in arrays of references */
168 for (; (p > start) && (*p != '/'); --p);
170 c->packagename = utf_new(start, p - start);
173 for (; (p > start) && (*p != '/'); --p);
175 c->packagename = utf_new(start, p - start);
180 /* class_create_classinfo ******************************************************
182 Create a new classinfo struct. The class name is set to the given utf *,
183 most other fields are initialized to zero.
185 Note: classname may be NULL. In this case a not-yet-named classinfo is
186 created. The name must be filled in later and class_set_packagename
187 must be called after that.
189 *******************************************************************************/
191 classinfo *class_create_classinfo(utf *classname)
195 #if defined(ENABLE_STATISTICS)
197 size_classinfo += sizeof(classinfo);
200 /* we use a safe name for temporarily unnamed classes */
202 if (classname == NULL)
203 classname = utf_not_named_yet;
207 log_message_utf("Creating class: ", classname);
210 /* GCNEW_UNCOLLECTABLE clears the allocated memory */
212 #if defined(ENABLE_GC_CACAO)
213 c = (classinfo *) heap_alloc_uncollectable(sizeof(classinfo));
215 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
216 /*c=NEW(classinfo);*/
220 /* Set the header.vftbl of all loaded classes to the one of
221 java.lang.Class, so Java code can use a class as object. */
223 if (class_java_lang_Class != NULL)
224 if (class_java_lang_Class->vftbl != NULL)
225 c->object.header.vftbl = class_java_lang_Class->vftbl;
227 #if defined(ENABLE_JAVASE)
228 /* check if the class is a reference class and flag it */
230 if (classname == utf_java_lang_ref_SoftReference) {
231 c->flags |= ACC_CLASS_SOFT_REFERENCE;
233 else if (classname == utf_java_lang_ref_WeakReference) {
234 c->flags |= ACC_CLASS_WEAK_REFERENCE;
236 else if (classname == utf_java_lang_ref_PhantomReference) {
237 c->flags |= ACC_CLASS_PHANTOM_REFERENCE;
241 if (classname != utf_not_named_yet)
242 class_set_packagename(c);
244 LOCK_INIT_OBJECT_LOCK(&c->object.header);
250 /* class_postset_header_vftbl **************************************************
252 Set the header.vftbl of all classes created before java.lang.Class
253 was linked. This is necessary that Java code can use a class as
256 *******************************************************************************/
258 void class_postset_header_vftbl(void)
262 classcache_name_entry *nmen;
263 classcache_class_entry *clsen;
265 assert(class_java_lang_Class);
267 for (slot = 0; slot < hashtable_classcache.size; slot++) {
268 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
270 for (; nmen; nmen = nmen->hashlink) {
271 /* iterate over all class entries */
273 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
276 /* now set the the vftbl */
278 if (c->object.header.vftbl == NULL)
279 c->object.header.vftbl = class_java_lang_Class->vftbl;
285 /* class_define ****************************************************************
287 Calls the loader and defines a class in the VM.
289 *******************************************************************************/
291 classinfo *class_define(utf *name, java_objectheader *cl, s4 length, u1 *data)
298 /* check if this class has already been defined */
300 c = classcache_lookup_defined_or_initiated(cl, name);
303 exceptions_throw_linkageerror("duplicate class definition: ", c);
308 /* create a new classinfo struct */
310 c = class_create_classinfo(name);
312 #if defined(ENABLE_STATISTICS)
315 if (opt_getloadingtime)
319 /* build a classbuffer with the given data */
321 cb = NEW(classbuffer);
328 /* preset the defining classloader */
332 /* load the class from this buffer */
334 r = load_class_from_classbuffer(cb);
338 FREE(cb, classbuffer);
340 #if defined(ENABLE_STATISTICS)
343 if (opt_getloadingtime)
348 /* If return value is NULL, we had a problem and the class is
349 not loaded. Now free the allocated memory, otherwise we
350 could run into a DOS. */
357 /* Store the newly defined class in the class cache. This call
358 also checks whether a class of the same name has already been
359 defined by the same defining loader, and if so, replaces the
360 newly created class by the one defined earlier. */
362 /* Important: The classinfo given to classcache_store must be
363 fully prepared because another thread may return
364 this pointer after the lookup at to top of this
365 function directly after the class cache lock has
368 c = classcache_store(cl, c, true);
374 /* class_load_attribute_sourcefile *********************************************
376 SourceFile_attribute {
377 u2 attribute_name_index;
382 *******************************************************************************/
384 static bool class_load_attribute_sourcefile(classbuffer *cb)
395 /* check buffer size */
397 if (!suck_check_classbuffer_size(cb, 4 + 2))
400 /* check attribute length */
402 attribute_length = suck_u4(cb);
404 if (attribute_length != 2) {
405 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
409 /* there can be no more than one SourceFile attribute */
411 if (c->sourcefile != NULL) {
412 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
418 sourcefile_index = suck_u2(cb);
419 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
421 if (sourcefile == NULL)
424 /* store sourcefile */
426 c->sourcefile = sourcefile;
432 /* class_load_attribute_enclosingmethod ****************************************
434 EnclosingMethod_attribute {
435 u2 attribute_name_index;
441 *******************************************************************************/
443 #if defined(ENABLE_JAVASE)
444 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
450 classref_or_classinfo cr;
451 constant_nameandtype *cn;
457 /* check buffer size */
459 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
462 /* check attribute length */
464 attribute_length = suck_u4(cb);
466 if (attribute_length != 4) {
467 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
471 /* there can be no more than one EnclosingMethod attribute */
473 if (c->enclosingmethod != NULL) {
474 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
478 /* get class index */
480 class_index = suck_u2(cb);
481 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
483 /* get method index */
485 method_index = suck_u2(cb);
486 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
488 /* store info in classinfo */
490 c->enclosingclass.any = cr.any;
491 c->enclosingmethod = cn;
495 #endif /* defined(ENABLE_JAVASE) */
498 /* class_load_attributes *******************************************************
500 Read attributes from ClassFile.
503 u2 attribute_name_index;
505 u1 info[attribute_length];
508 InnerClasses_attribute {
509 u2 attribute_name_index;
513 *******************************************************************************/
515 bool class_load_attributes(classbuffer *cb)
520 u2 attribute_name_index;
525 /* get attributes count */
527 if (!suck_check_classbuffer_size(cb, 2))
530 attributes_count = suck_u2(cb);
532 for (i = 0; i < attributes_count; i++) {
533 /* get attribute name */
535 if (!suck_check_classbuffer_size(cb, 2))
538 attribute_name_index = suck_u2(cb);
540 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
542 if (attribute_name == NULL)
545 if (attribute_name == utf_InnerClasses) {
548 if (c->innerclass != NULL) {
549 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
553 if (!suck_check_classbuffer_size(cb, 4 + 2))
556 /* skip attribute length */
559 /* number of records */
560 c->innerclasscount = suck_u2(cb);
562 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
565 /* allocate memory for innerclass structure */
566 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
568 for (j = 0; j < c->innerclasscount; j++) {
569 /* The innerclass structure contains a class with an encoded
570 name, its defining scope, its simple name and a bitmask of
571 the access flags. If an inner class is not a member, its
572 outer_class is NULL, if a class is anonymous, its name is
575 innerclassinfo *info = c->innerclass + j;
577 info->inner_class.ref =
578 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
579 info->outer_class.ref =
580 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
582 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
583 info->flags = suck_u2(cb);
586 else if (attribute_name == utf_SourceFile) {
589 if (!class_load_attribute_sourcefile(cb))
592 #if defined(ENABLE_JAVASE)
593 else if (attribute_name == utf_EnclosingMethod) {
594 /* EnclosingMethod */
596 if (!class_load_attribute_enclosingmethod(cb))
599 else if (attribute_name == utf_Signature) {
602 if (!loader_load_attribute_signature(cb, &(c->signature)))
606 /* XXX We can't do a release with that enabled */
608 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
609 /* RuntimeVisibleAnnotations */
611 if (!annotation_load_attribute_runtimevisibleannotations(cb))
617 /* unknown attribute */
619 if (!loader_skip_attribute_body(cb))
628 /* class_freepool **************************************************************
630 Frees all resources used by this classes Constant Pool.
632 *******************************************************************************/
634 static void class_freecpool(classinfo *c)
640 if (c->cptags && c->cpinfos) {
641 for (idx = 0; idx < c->cpcount; idx++) {
642 tag = c->cptags[idx];
643 info = c->cpinfos[idx];
647 case CONSTANT_Fieldref:
648 case CONSTANT_Methodref:
649 case CONSTANT_InterfaceMethodref:
650 FREE(info, constant_FMIref);
652 case CONSTANT_Integer:
653 FREE(info, constant_integer);
656 FREE(info, constant_float);
659 FREE(info, constant_long);
661 case CONSTANT_Double:
662 FREE(info, constant_double);
664 case CONSTANT_NameAndType:
665 FREE(info, constant_nameandtype);
673 MFREE(c->cptags, u1, c->cpcount);
676 MFREE(c->cpinfos, voidptr, c->cpcount);
680 /* class_getconstant ***********************************************************
682 Retrieves the value at position 'pos' of the constantpool of a
683 class. If the type of the value is other than 'ctype', an error is
686 *******************************************************************************/
688 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
690 /* check index and type of constantpool entry */
691 /* (pos == 0 is caught by type comparison) */
693 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
694 exceptions_throw_classformaterror(c, "Illegal constant pool index");
698 return c->cpinfos[pos];
702 /* innerclass_getconstant ******************************************************
704 Like class_getconstant, but if cptags is ZERO, null is returned.
706 *******************************************************************************/
708 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
710 /* invalid position in constantpool */
712 if (pos >= c->cpcount) {
713 exceptions_throw_classformaterror(c, "Illegal constant pool index");
717 /* constantpool entry of type 0 */
719 if (c->cptags[pos] == 0)
722 /* check type of constantpool entry */
724 if (c->cptags[pos] != ctype) {
725 exceptions_throw_classformaterror(c, "Illegal constant pool index");
729 return c->cpinfos[pos];
733 /* class_free ******************************************************************
735 Frees all resources used by the class.
737 *******************************************************************************/
739 void class_free(classinfo *c)
747 MFREE(c->interfaces, classinfo*, c->interfacescount);
750 for (i = 0; i < c->fieldscount; i++)
751 field_free(&(c->fields[i]));
752 #if defined(ENABLE_CACAO_GC)
753 MFREE(c->fields, fieldinfo, c->fieldscount);
758 for (i = 0; i < c->methodscount; i++)
759 method_free(&(c->methods[i]));
760 MFREE(c->methods, methodinfo, c->methodscount);
763 if ((v = c->vftbl) != NULL) {
765 mem_free(v->arraydesc,sizeof(arraydescriptor));
767 for (i = 0; i < v->interfacetablelength; i++) {
768 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
770 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
772 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
773 sizeof(methodptr*) * (v->interfacetablelength -
774 (v->interfacetablelength > 0));
775 v = (vftbl_t*) (((methodptr*) v) -
776 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
781 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
783 /* if (c->classvftbl)
784 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
790 /* get_array_class *************************************************************
792 Returns the array class with the given name for the given
793 classloader, or NULL if an exception occurred.
795 Note: This function does eager loading.
797 *******************************************************************************/
799 static classinfo *get_array_class(utf *name,classloader *initloader,
800 classloader *defloader,bool link)
804 /* lookup this class in the classcache */
805 c = classcache_lookup(initloader,name);
807 c = classcache_lookup_defined(defloader,name);
810 /* we have to create it */
811 c = class_create_classinfo(name);
812 c = load_newly_created_array(c,initloader);
818 assert(c->state & CLASS_LOADED);
819 assert(c->classloader == defloader);
821 if (link && !(c->state & CLASS_LINKED))
825 assert(!link || (c->state & CLASS_LINKED));
831 /* class_array_of **************************************************************
833 Returns an array class with the given component class. The array
834 class is dynamically created if neccessary.
836 *******************************************************************************/
838 classinfo *class_array_of(classinfo *component, bool link)
845 dumpsize = dump_size();
847 /* Assemble the array class name */
848 namelen = component->name->blength;
850 if (component->name->text[0] == '[') {
851 /* the component is itself an array */
852 namebuf = DMNEW(char, namelen + 1);
854 MCOPY(namebuf + 1, component->name->text, char, namelen);
858 /* the component is a non-array class */
859 namebuf = DMNEW(char, namelen + 3);
862 MCOPY(namebuf + 2, component->name->text, char, namelen);
863 namebuf[2 + namelen] = ';';
867 c = get_array_class(utf_new(namebuf, namelen),
868 component->classloader,
869 component->classloader,
872 dump_release(dumpsize);
878 /* class_multiarray_of *********************************************************
880 Returns an array class with the given dimension and element class.
881 The array class is dynamically created if neccessary.
883 *******************************************************************************/
885 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
892 dumpsize = dump_size();
895 log_text("Invalid array dimension requested");
899 /* Assemble the array class name */
900 namelen = element->name->blength;
902 if (element->name->text[0] == '[') {
903 /* the element is itself an array */
904 namebuf = DMNEW(char, namelen + dim);
905 memcpy(namebuf + dim, element->name->text, namelen);
909 /* the element is a non-array class */
910 namebuf = DMNEW(char, namelen + 2 + dim);
912 memcpy(namebuf + dim + 1, element->name->text, namelen);
913 namelen += (2 + dim);
914 namebuf[namelen - 1] = ';';
916 memset(namebuf, '[', dim);
918 c = get_array_class(utf_new(namebuf, namelen),
919 element->classloader,
920 element->classloader,
923 dump_release(dumpsize);
929 /* class_lookup_classref *******************************************************
931 Looks up the constant_classref for a given classname in the classref
935 cls..............the class containing the reference
936 name.............the name of the class refered to
939 a pointer to a constant_classref, or
940 NULL if the reference was not found
942 *******************************************************************************/
944 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
946 constant_classref *ref;
947 extra_classref *xref;
952 assert(!cls->classrefcount || cls->classrefs);
954 /* first search the main classref table */
955 count = cls->classrefcount;
956 ref = cls->classrefs;
957 for (; count; --count, ++ref)
958 if (ref->name == name)
961 /* next try the list of extra classrefs */
962 for (xref = cls->extclassrefs; xref; xref = xref->next) {
963 if (xref->classref.name == name)
964 return &(xref->classref);
972 /* class_get_classref **********************************************************
974 Returns the constant_classref for a given classname.
977 cls..............the class containing the reference
978 name.............the name of the class refered to
981 a pointer to a constant_classref (never NULL)
984 The given name is not checked for validity!
986 *******************************************************************************/
988 constant_classref *class_get_classref(classinfo *cls, utf *name)
990 constant_classref *ref;
991 extra_classref *xref;
996 ref = class_lookup_classref(cls,name);
1000 xref = NEW(extra_classref);
1001 CLASSREF_INIT(xref->classref,cls,name);
1003 xref->next = cls->extclassrefs;
1004 cls->extclassrefs = xref;
1006 return &(xref->classref);
1010 /* class_get_self_classref *****************************************************
1012 Returns the constant_classref to the class itself.
1015 cls..............the class containing the reference
1018 a pointer to a constant_classref (never NULL)
1020 *******************************************************************************/
1022 constant_classref *class_get_self_classref(classinfo *cls)
1024 /* XXX this should be done in a faster way. Maybe always make */
1025 /* the classref of index 0 a self reference. */
1026 return class_get_classref(cls,cls->name);
1029 /* class_get_classref_multiarray_of ********************************************
1031 Returns an array type reference with the given dimension and element class
1035 dim..............the requested dimension
1036 dim must be in [1;255]. This is NOT checked!
1037 ref..............the component class reference
1040 a pointer to the class reference for the array type
1043 The referer of `ref` is used as the referer for the new classref.
1045 *******************************************************************************/
1047 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1052 constant_classref *cr;
1055 assert(dim >= 1 && dim <= 255);
1057 dumpsize = dump_size();
1059 /* Assemble the array class name */
1060 namelen = ref->name->blength;
1062 if (ref->name->text[0] == '[') {
1063 /* the element is itself an array */
1064 namebuf = DMNEW(char, namelen + dim);
1065 memcpy(namebuf + dim, ref->name->text, namelen);
1069 /* the element is a non-array class */
1070 namebuf = DMNEW(char, namelen + 2 + dim);
1072 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1073 namelen += (2 + dim);
1074 namebuf[namelen - 1] = ';';
1076 memset(namebuf, '[', dim);
1078 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1080 dump_release(dumpsize);
1086 /* class_get_classref_component_of *********************************************
1088 Returns the component classref of a given array type reference
1091 ref..............the array type reference
1094 a reference to the component class, or
1095 NULL if `ref` is not an object array type reference
1098 The referer of `ref` is used as the referer for the new classref.
1100 *******************************************************************************/
1102 constant_classref *class_get_classref_component_of(constant_classref *ref)
1109 name = ref->name->text;
1113 namelen = ref->name->blength - 1;
1118 else if (*name != '[') {
1122 return class_get_classref(ref->referer, utf_new(name, namelen));
1126 /* class_findmethod ************************************************************
1128 Searches a 'classinfo' structure for a method having the given name
1129 and descriptor. If descriptor is NULL, it is ignored.
1131 *******************************************************************************/
1133 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1138 for (i = 0; i < c->methodscount; i++) {
1139 m = &(c->methods[i]);
1141 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1149 /* class_resolvemethod *********************************************************
1151 Searches a class and it's super classes for a method.
1153 Superinterfaces are *not* searched.
1155 *******************************************************************************/
1157 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1162 m = class_findmethod(c, name, desc);
1167 /* JVM Specification bug:
1169 It is important NOT to resolve special <init> and <clinit>
1170 methods to super classes or interfaces; yet, this is not
1171 explicited in the specification. Section 5.4.3.3 should be
1172 updated appropriately. */
1174 if (name == utf_init || name == utf_clinit)
1184 /* class_resolveinterfacemethod_intern *****************************************
1186 Internally used helper function. Do not use this directly.
1188 *******************************************************************************/
1190 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1191 utf *name, utf *desc)
1196 /* try to find the method in the class */
1198 m = class_findmethod(c, name, desc);
1203 /* no method found? try the superinterfaces */
1205 for (i = 0; i < c->interfacescount; i++) {
1206 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1213 /* no method found */
1219 /* class_resolveclassmethod ****************************************************
1221 Resolves a reference from REFERER to a method with NAME and DESC in
1224 If the method cannot be resolved the return value is NULL. If
1225 EXCEPT is true *exceptionptr is set, too.
1227 *******************************************************************************/
1229 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1230 classinfo *referer, bool throwexception)
1236 /* if (c->flags & ACC_INTERFACE) { */
1237 /* if (throwexception) */
1238 /* *exceptionptr = */
1239 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1243 /* try class c and its superclasses */
1247 m = class_resolvemethod(cls, name, desc);
1252 /* try the superinterfaces */
1254 for (i = 0; i < c->interfacescount; i++) {
1255 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1263 exceptions_throw_nosuchmethoderror(c, name, desc);
1268 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1270 exceptions_throw_abstractmethoderror();
1275 /* XXX check access rights */
1281 /* class_resolveinterfacemethod ************************************************
1283 Resolves a reference from REFERER to a method with NAME and DESC in
1286 If the method cannot be resolved the return value is NULL. If
1287 EXCEPT is true *exceptionptr is set, too.
1289 *******************************************************************************/
1291 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1292 classinfo *referer, bool throwexception)
1296 if (!(c->flags & ACC_INTERFACE)) {
1298 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1303 mi = class_resolveinterfacemethod_intern(c, name, desc);
1308 /* try class java.lang.Object */
1310 mi = class_findmethod(class_java_lang_Object, name, desc);
1316 exceptions_throw_nosuchmethoderror(c, name, desc);
1322 /* class_findfield *************************************************************
1324 Searches for field with specified name and type in a classinfo
1325 structure. If no such field is found NULL is returned.
1327 *******************************************************************************/
1329 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1333 for (i = 0; i < c->fieldscount; i++)
1334 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1335 return &(c->fields[i]);
1338 return class_findfield(c->super.cls, name, desc);
1344 /* class_findfield_approx ******************************************************
1346 Searches in 'classinfo'-structure for a field with the specified
1349 *******************************************************************************/
1351 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1355 /* get field index */
1357 i = class_findfield_index_by_name(c, name);
1359 /* field was not found, return */
1364 /* return field address */
1366 return &(c->fields[i]);
1370 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1374 for (i = 0; i < c->fieldscount; i++) {
1375 /* compare field names */
1377 if ((c->fields[i].name == name))
1381 /* field was not found, raise exception */
1383 exceptions_throw_nosuchfielderror(c, name);
1389 /****************** Function: class_resolvefield_int ***************************
1391 This is an internally used helper function. Do not use this directly.
1393 Tries to resolve a field having the given name and type.
1394 If the field cannot be resolved, NULL is returned.
1396 *******************************************************************************/
1398 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1403 /* search for field in class c */
1405 for (i = 0; i < c->fieldscount; i++) {
1406 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1407 return &(c->fields[i]);
1411 /* try superinterfaces recursively */
1413 for (i = 0; i < c->interfacescount; i++) {
1414 fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
1419 /* try superclass */
1422 return class_resolvefield_int(c->super.cls, name, desc);
1430 /********************* Function: class_resolvefield ***************************
1432 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1434 If the field cannot be resolved the return value is NULL. If EXCEPT is
1435 true *exceptionptr is set, too.
1437 *******************************************************************************/
1439 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1440 classinfo *referer, bool throwexception)
1444 fi = class_resolvefield_int(c, name, desc);
1448 exceptions_throw_nosuchfielderror(c, name);
1453 /* XXX check access rights */
1459 /* class_is_primitive **********************************************************
1461 Check if the given class is a primitive class.
1463 *******************************************************************************/
1465 bool class_is_primitive(classinfo *c)
1469 /* search table of primitive classes */
1471 for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
1472 if (primitivetype_table[i].class_primitive == c)
1479 /* class_primitive_get *********************************************************
1481 Returns the primitive class of the given class name.
1483 *******************************************************************************/
1485 classinfo *class_primitive_get(utf *name)
1489 /* search table of primitive classes */
1491 for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
1492 if (primitivetype_table[i].name == name)
1493 return primitivetype_table[i].class_primitive;
1495 vm_abort("class_primitive_get: unknown primitive type");
1497 /* keep compiler happy */
1503 /* class_issubclass ************************************************************
1505 Checks if sub is a descendant of super.
1507 *******************************************************************************/
1509 bool class_issubclass(classinfo *sub, classinfo *super)
1518 sub = sub->super.cls;
1523 /* class_isanysubclass *********************************************************
1525 Checks a subclass relation between two classes. Implemented
1526 interfaces are interpreted as super classes.
1528 Return value: 1 ... sub is subclass of super
1531 *******************************************************************************/
1533 bool class_isanysubclass(classinfo *sub, classinfo *super)
1535 castinfo classvalues;
1539 /* This is the trivial case. */
1544 /* Primitive classes are only subclasses of themselves. */
1546 if ((sub->flags & ACC_CLASS_PRIMITIVE) ||
1547 (super->flags & ACC_CLASS_PRIMITIVE))
1550 /* Check for interfaces. */
1552 if (super->flags & ACC_INTERFACE) {
1553 result = (sub->vftbl->interfacetablelength > super->index) &&
1554 (sub->vftbl->interfacetable[-super->index] != NULL);
1557 /* java.lang.Object is the only super class of any
1560 if (sub->flags & ACC_INTERFACE)
1561 return (super == class_java_lang_Object);
1563 ASM_GETCLASSVALUES_ATOMIC(super->vftbl, sub->vftbl, &classvalues);
1565 diffval = classvalues.sub_baseval - classvalues.super_baseval;
1566 result = diffval <= (u4) classvalues.super_diffval;
1573 /* class_printflags ************************************************************
1575 Prints flags of a class.
1577 *******************************************************************************/
1579 #if !defined(NDEBUG)
1580 void class_printflags(classinfo *c)
1587 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
1588 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
1589 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
1590 if (c->flags & ACC_STATIC) printf(" STATIC");
1591 if (c->flags & ACC_FINAL) printf(" FINAL");
1592 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
1593 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
1594 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
1595 if (c->flags & ACC_NATIVE) printf(" NATIVE");
1596 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
1597 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
1602 /* class_print *****************************************************************
1604 Prints classname plus flags.
1606 *******************************************************************************/
1608 #if !defined(NDEBUG)
1609 void class_print(classinfo *c)
1616 utf_display_printable_ascii(c->name);
1617 class_printflags(c);
1622 /* class_classref_print ********************************************************
1624 Prints classname plus referer class.
1626 *******************************************************************************/
1628 #if !defined(NDEBUG)
1629 void class_classref_print(constant_classref *cr)
1636 utf_display_printable_ascii(cr->name);
1639 class_print(cr->referer);
1647 /* class_println ***************************************************************
1649 Prints classname plus flags and new line.
1651 *******************************************************************************/
1653 #if !defined(NDEBUG)
1654 void class_println(classinfo *c)
1662 /* class_classref_println ******************************************************
1664 Prints classname plus referer class and new line.
1666 *******************************************************************************/
1668 #if !defined(NDEBUG)
1669 void class_classref_println(constant_classref *cr)
1671 class_classref_print(cr);
1677 /* class_classref_or_classinfo_print *******************************************
1679 Prints classname plus referer class.
1681 *******************************************************************************/
1683 #if !defined(NDEBUG)
1684 void class_classref_or_classinfo_print(classref_or_classinfo c)
1686 if (c.any == NULL) {
1687 printf("(classref_or_classinfo) NULL");
1691 class_classref_print(c.ref);
1698 /* class_classref_or_classinfo_println *****************************************
1700 Prints classname plus referer class and a newline.
1702 *******************************************************************************/
1704 void class_classref_or_classinfo_println(classref_or_classinfo c)
1706 class_classref_or_classinfo_println(c);
1711 /* class_showconstantpool ******************************************************
1713 Dump the constant pool of the given class to stdout.
1715 *******************************************************************************/
1717 #if !defined(NDEBUG)
1718 void class_showconstantpool (classinfo *c)
1723 printf ("---- dump of constant pool ----\n");
1725 for (i=0; i<c->cpcount; i++) {
1726 printf ("#%d: ", (int) i);
1728 e = c -> cpinfos [i];
1731 switch (c -> cptags [i]) {
1732 case CONSTANT_Class:
1733 printf ("Classreference -> ");
1734 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
1736 case CONSTANT_Fieldref:
1737 printf ("Fieldref -> ");
1738 field_fieldref_print((constant_FMIref *) e);
1740 case CONSTANT_Methodref:
1741 printf ("Methodref -> ");
1742 method_methodref_print((constant_FMIref *) e);
1744 case CONSTANT_InterfaceMethodref:
1745 printf ("InterfaceMethod -> ");
1746 method_methodref_print((constant_FMIref *) e);
1748 case CONSTANT_String:
1749 printf ("String -> ");
1750 utf_display_printable_ascii (e);
1752 case CONSTANT_Integer:
1753 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
1755 case CONSTANT_Float:
1756 printf ("Float -> %f", ((constant_float*)e) -> value);
1758 case CONSTANT_Double:
1759 printf ("Double -> %f", ((constant_double*)e) -> value);
1763 u8 v = ((constant_long*)e) -> value;
1765 printf ("Long -> %ld", (long int) v);
1767 printf ("Long -> HI: %ld, LO: %ld\n",
1768 (long int) v.high, (long int) v.low);
1772 case CONSTANT_NameAndType:
1774 constant_nameandtype *cnt = e;
1775 printf ("NameAndType: ");
1776 utf_display_printable_ascii (cnt->name);
1778 utf_display_printable_ascii (cnt->descriptor);
1782 printf ("Utf8 -> ");
1783 utf_display_printable_ascii (e);
1786 log_text("Invalid type of ConstantPool-Entry");
1794 #endif /* !defined(NDEBUG) */
1797 /* class_showmethods ***********************************************************
1799 Dump info about the fields and methods of the given class to stdout.
1801 *******************************************************************************/
1803 #if !defined(NDEBUG)
1804 void class_showmethods (classinfo *c)
1808 printf("--------- Fields and Methods ----------------\n");
1810 class_printflags(c);
1814 utf_display_printable_ascii(c->name);
1819 utf_display_printable_ascii(c->super.cls->name);
1823 printf("Index: %d\n", c->index);
1825 printf("Interfaces:\n");
1826 for (i = 0; i < c->interfacescount; i++) {
1828 utf_display_printable_ascii(c->interfaces[i].cls->name);
1829 printf (" (%d)\n", c->interfaces[i].cls->index);
1832 printf("Fields:\n");
1833 for (i = 0; i < c->fieldscount; i++)
1834 field_println(&(c->fields[i]));
1836 printf("Methods:\n");
1837 for (i = 0; i < c->methodscount; i++) {
1838 methodinfo *m = &(c->methods[i]);
1840 if (!(m->flags & ACC_STATIC))
1841 printf("vftblindex: %d ", m->vftblindex);
1846 printf ("Virtual function table:\n");
1847 for (i = 0; i < c->vftbl->vftbllength; i++)
1848 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
1850 #endif /* !defined(NDEBUG) */
1854 * These are local overrides for various environment variables in Emacs.
1855 * Please do not remove this and leave it at the end of the file, where
1856 * Emacs will automagically detect them.
1857 * ---------------------------------------------------------------------
1860 * indent-tabs-mode: t
1864 * vim:noexpandtab:sw=4:ts=4: