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 8249 2007-07-31 12:59:03Z panzi $
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/loader.h"
56 #include "vmcore/options.h"
58 #if defined(ENABLE_STATISTICS)
59 # include "vmcore/statistics.h"
62 #include "vmcore/suck.h"
63 #include "vmcore/utf8.h"
66 /* global variables ***********************************************************/
68 /* frequently used classes ****************************************************/
70 /* important system classes */
72 classinfo *class_java_lang_Object;
73 classinfo *class_java_lang_Class;
74 classinfo *class_java_lang_ClassLoader;
75 classinfo *class_java_lang_Cloneable;
76 classinfo *class_java_lang_SecurityManager;
77 classinfo *class_java_lang_String;
78 classinfo *class_java_lang_System;
79 classinfo *class_java_lang_Thread;
80 classinfo *class_java_lang_ThreadGroup;
81 classinfo *class_java_lang_VMSystem;
82 classinfo *class_java_lang_VMThread;
83 classinfo *class_java_io_Serializable;
85 #if defined(WITH_CLASSPATH_SUN)
86 classinfo *class_sun_reflect_MagicAccessorImpl;
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;
136 #if defined(ENABLE_ANNOTATIONS)
137 classinfo *class_sun_reflect_ConstantPool;
138 classinfo *class_sun_reflect_annotation_AnnotationParser;
143 /* pseudo classes for the typechecker */
145 classinfo *pseudo_class_Arraystub;
146 classinfo *pseudo_class_Null;
147 classinfo *pseudo_class_New;
150 /* class_set_packagename *******************************************************
152 Derive the package name from the class name and store it in the struct.
154 *******************************************************************************/
156 void class_set_packagename(classinfo *c)
158 char *p = UTF_END(c->name) - 1;
159 char *start = c->name->text;
161 /* set the package name */
162 /* classes in the unnamed package keep packagename == NULL */
164 if (c->name->text[0] == '[') {
165 /* set packagename of arrays to the element's package */
167 for (; *start == '['; start++);
169 /* skip the 'L' in arrays of references */
173 for (; (p > start) && (*p != '/'); --p);
175 c->packagename = utf_new(start, p - start);
178 for (; (p > start) && (*p != '/'); --p);
180 c->packagename = utf_new(start, p - start);
185 /* class_create_classinfo ******************************************************
187 Create a new classinfo struct. The class name is set to the given utf *,
188 most other fields are initialized to zero.
190 Note: classname may be NULL. In this case a not-yet-named classinfo is
191 created. The name must be filled in later and class_set_packagename
192 must be called after that.
194 *******************************************************************************/
196 classinfo *class_create_classinfo(utf *classname)
200 #if defined(ENABLE_STATISTICS)
202 size_classinfo += sizeof(classinfo);
205 /* we use a safe name for temporarily unnamed classes */
207 if (classname == NULL)
208 classname = utf_not_named_yet;
212 log_message_utf("Creating class: ", classname);
215 /* GCNEW_UNCOLLECTABLE clears the allocated memory */
217 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
218 /*c=NEW(classinfo);*/
221 /* Set the header.vftbl of all loaded classes to the one of
222 java.lang.Class, so Java code can use a class as object. */
224 if (class_java_lang_Class != NULL)
225 if (class_java_lang_Class->vftbl != NULL)
226 c->object.header.vftbl = class_java_lang_Class->vftbl;
228 #if defined(ENABLE_JAVASE)
229 /* check if the class is a reference class and flag it */
231 if (classname == utf_java_lang_ref_SoftReference) {
232 c->flags |= ACC_CLASS_REFERENCE_SOFT;
234 else if (classname == utf_java_lang_ref_WeakReference) {
235 c->flags |= ACC_CLASS_REFERENCE_WEAK;
237 else if (classname == utf_java_lang_ref_PhantomReference) {
238 c->flags |= ACC_CLASS_REFERENCE_PHANTOM;
242 if (classname != utf_not_named_yet)
243 class_set_packagename(c);
245 LOCK_INIT_OBJECT_LOCK(&c->object.header);
251 /* class_postset_header_vftbl **************************************************
253 Set the header.vftbl of all classes created before java.lang.Class
254 was linked. This is necessary that Java code can use a class as
257 *******************************************************************************/
259 void class_postset_header_vftbl(void)
263 classcache_name_entry *nmen;
264 classcache_class_entry *clsen;
266 assert(class_java_lang_Class);
268 for (slot = 0; slot < hashtable_classcache.size; slot++) {
269 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
271 for (; nmen; nmen = nmen->hashlink) {
272 /* iterate over all class entries */
274 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
277 /* now set the the vftbl */
279 if (c->object.header.vftbl == NULL)
280 c->object.header.vftbl = class_java_lang_Class->vftbl;
286 /* class_define ****************************************************************
288 Calls the loader and defines a class in the VM.
290 *******************************************************************************/
292 classinfo *class_define(utf *name, java_objectheader *cl, int32_t length, const uint8_t *data)
299 /* check if this class has already been defined */
301 c = classcache_lookup_defined_or_initiated(cl, name);
304 exceptions_throw_linkageerror("duplicate class definition: ", c);
309 /* create a new classinfo struct */
311 c = class_create_classinfo(name);
313 #if defined(ENABLE_STATISTICS)
316 if (opt_getloadingtime)
320 /* build a classbuffer with the given data */
322 cb = NEW(classbuffer);
329 /* preset the defining classloader */
333 /* load the class from this buffer */
335 r = load_class_from_classbuffer(cb);
339 FREE(cb, classbuffer);
341 #if defined(ENABLE_STATISTICS)
344 if (opt_getloadingtime)
349 /* If return value is NULL, we had a problem and the class is
350 not loaded. Now free the allocated memory, otherwise we
351 could run into a DOS. */
358 /* Store the newly defined class in the class cache. This call
359 also checks whether a class of the same name has already been
360 defined by the same defining loader, and if so, replaces the
361 newly created class by the one defined earlier. */
363 /* Important: The classinfo given to classcache_store must be
364 fully prepared because another thread may return
365 this pointer after the lookup at to top of this
366 function directly after the class cache lock has
369 c = classcache_store(cl, c, true);
375 /* class_load_attribute_sourcefile *********************************************
377 SourceFile_attribute {
378 u2 attribute_name_index;
383 *******************************************************************************/
385 static bool class_load_attribute_sourcefile(classbuffer *cb)
396 /* check buffer size */
398 if (!suck_check_classbuffer_size(cb, 4 + 2))
401 /* check attribute length */
403 attribute_length = suck_u4(cb);
405 if (attribute_length != 2) {
406 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
410 /* there can be no more than one SourceFile attribute */
412 if (c->sourcefile != NULL) {
413 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
419 sourcefile_index = suck_u2(cb);
420 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
422 if (sourcefile == NULL)
425 /* store sourcefile */
427 c->sourcefile = sourcefile;
433 /* class_load_attribute_enclosingmethod ****************************************
435 EnclosingMethod_attribute {
436 u2 attribute_name_index;
442 *******************************************************************************/
444 #if defined(ENABLE_JAVASE)
445 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
451 classref_or_classinfo cr;
452 constant_nameandtype *cn;
458 /* check buffer size */
460 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
463 /* check attribute length */
465 attribute_length = suck_u4(cb);
467 if (attribute_length != 4) {
468 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
472 /* there can be no more than one EnclosingMethod attribute */
474 if (c->enclosingmethod != NULL) {
475 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
479 /* get class index */
481 class_index = suck_u2(cb);
482 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
484 /* get method index */
486 method_index = suck_u2(cb);
487 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
489 /* store info in classinfo */
491 c->enclosingclass.any = cr.any;
492 c->enclosingmethod = cn;
496 #endif /* defined(ENABLE_JAVASE) */
499 /* class_load_attributes *******************************************************
501 Read attributes from ClassFile.
504 u2 attribute_name_index;
506 u1 info[attribute_length];
509 InnerClasses_attribute {
510 u2 attribute_name_index;
514 *******************************************************************************/
516 bool class_load_attributes(classbuffer *cb)
521 u2 attribute_name_index;
526 /* get attributes count */
528 if (!suck_check_classbuffer_size(cb, 2))
531 attributes_count = suck_u2(cb);
533 for (i = 0; i < attributes_count; i++) {
534 /* get attribute name */
536 if (!suck_check_classbuffer_size(cb, 2))
539 attribute_name_index = suck_u2(cb);
541 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
543 if (attribute_name == NULL)
546 if (attribute_name == utf_InnerClasses) {
549 if (c->innerclass != NULL) {
550 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
554 if (!suck_check_classbuffer_size(cb, 4 + 2))
557 /* skip attribute length */
560 /* number of records */
561 c->innerclasscount = suck_u2(cb);
563 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
566 /* allocate memory for innerclass structure */
567 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
569 for (j = 0; j < c->innerclasscount; j++) {
570 /* The innerclass structure contains a class with an encoded
571 name, its defining scope, its simple name and a bitmask of
572 the access flags. If an inner class is not a member, its
573 outer_class is NULL, if a class is anonymous, its name is
576 innerclassinfo *info = c->innerclass + j;
578 info->inner_class.ref =
579 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
580 info->outer_class.ref =
581 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
583 innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
584 info->flags = suck_u2(cb);
587 else if (attribute_name == utf_SourceFile) {
590 if (!class_load_attribute_sourcefile(cb))
593 #if defined(ENABLE_JAVASE)
594 else if (attribute_name == utf_EnclosingMethod) {
595 /* EnclosingMethod */
597 if (!class_load_attribute_enclosingmethod(cb))
600 else if (attribute_name == utf_Signature) {
603 if (!loader_load_attribute_signature(cb, &(c->signature)))
608 #if defined(ENABLE_ANNOTATIONS)
609 /* XXX We can't do a release with that enabled */
611 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
612 /* RuntimeVisibleAnnotations */
613 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
616 /* XXX RuntimeInvisibleAnnotations should only be loaded
617 * (or returned to Java) if some commandline options says so.
618 * Currently there is no such option available in cacao,
619 * therefore I load them allways (for testing purpose).
620 * Anyway, bytecode for RuntimeInvisibleAnnotations is only
621 * generated if you tell javac to do so. So in most cases
622 * there won't be any.
624 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
625 /* RuntimeInvisibleAnnotations */
626 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
632 /* unknown attribute */
634 if (!loader_skip_attribute_body(cb))
643 /* class_freepool **************************************************************
645 Frees all resources used by this classes Constant Pool.
647 *******************************************************************************/
649 static void class_freecpool(classinfo *c)
655 if (c->cptags && c->cpinfos) {
656 for (idx = 0; idx < c->cpcount; idx++) {
657 tag = c->cptags[idx];
658 info = c->cpinfos[idx];
662 case CONSTANT_Fieldref:
663 case CONSTANT_Methodref:
664 case CONSTANT_InterfaceMethodref:
665 FREE(info, constant_FMIref);
667 case CONSTANT_Integer:
668 FREE(info, constant_integer);
671 FREE(info, constant_float);
674 FREE(info, constant_long);
676 case CONSTANT_Double:
677 FREE(info, constant_double);
679 case CONSTANT_NameAndType:
680 FREE(info, constant_nameandtype);
688 MFREE(c->cptags, u1, c->cpcount);
691 MFREE(c->cpinfos, voidptr, c->cpcount);
695 /* class_getconstant ***********************************************************
697 Retrieves the value at position 'pos' of the constantpool of a
698 class. If the type of the value is other than 'ctype', an error is
701 *******************************************************************************/
703 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
705 /* check index and type of constantpool entry */
706 /* (pos == 0 is caught by type comparison) */
708 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
709 exceptions_throw_classformaterror(c, "Illegal constant pool index");
713 return c->cpinfos[pos];
717 /* innerclass_getconstant ******************************************************
719 Like class_getconstant, but if cptags is ZERO, null is returned.
721 *******************************************************************************/
723 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
725 /* invalid position in constantpool */
727 if (pos >= c->cpcount) {
728 exceptions_throw_classformaterror(c, "Illegal constant pool index");
732 /* constantpool entry of type 0 */
734 if (c->cptags[pos] == 0)
737 /* check type of constantpool entry */
739 if (c->cptags[pos] != ctype) {
740 exceptions_throw_classformaterror(c, "Illegal constant pool index");
744 return c->cpinfos[pos];
748 /* class_free ******************************************************************
750 Frees all resources used by the class.
752 *******************************************************************************/
754 void class_free(classinfo *c)
762 MFREE(c->interfaces, classinfo*, c->interfacescount);
765 for (i = 0; i < c->fieldscount; i++)
766 field_free(&(c->fields[i]));
767 #if defined(ENABLE_CACAO_GC)
768 MFREE(c->fields, fieldinfo, c->fieldscount);
773 for (i = 0; i < c->methodscount; i++)
774 method_free(&(c->methods[i]));
775 MFREE(c->methods, methodinfo, c->methodscount);
778 if ((v = c->vftbl) != NULL) {
780 mem_free(v->arraydesc,sizeof(arraydescriptor));
782 for (i = 0; i < v->interfacetablelength; i++) {
783 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
785 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
787 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
788 sizeof(methodptr*) * (v->interfacetablelength -
789 (v->interfacetablelength > 0));
790 v = (vftbl_t*) (((methodptr*) v) -
791 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
796 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
798 /* if (c->classvftbl)
799 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
803 #if defined(ENABLE_ANNOTATIONS)
804 annotation_bytearray_free(c->annotations);
806 annotation_bytearrays_free(c->method_annotations);
807 annotation_bytearrays_free(c->method_parameterannotations);
808 annotation_bytearrays_free(c->method_annotationdefaults);
810 annotation_bytearrays_free(c->field_annotations);
815 /* get_array_class *************************************************************
817 Returns the array class with the given name for the given
818 classloader, or NULL if an exception occurred.
820 Note: This function does eager loading.
822 *******************************************************************************/
824 static classinfo *get_array_class(utf *name,java_objectheader *initloader,
825 java_objectheader *defloader,bool link)
829 /* lookup this class in the classcache */
830 c = classcache_lookup(initloader,name);
832 c = classcache_lookup_defined(defloader,name);
835 /* we have to create it */
836 c = class_create_classinfo(name);
837 c = load_newly_created_array(c,initloader);
843 assert(c->state & CLASS_LOADED);
844 assert(c->classloader == defloader);
846 if (link && !(c->state & CLASS_LINKED))
850 assert(!link || (c->state & CLASS_LINKED));
856 /* class_array_of **************************************************************
858 Returns an array class with the given component class. The array
859 class is dynamically created if neccessary.
861 *******************************************************************************/
863 classinfo *class_array_of(classinfo *component, bool link)
865 java_objectheader *cl;
872 cl = component->classloader;
874 dumpsize = dump_size();
876 /* Assemble the array class name */
877 namelen = component->name->blength;
879 if (component->name->text[0] == '[') {
880 /* the component is itself an array */
881 namebuf = DMNEW(char, namelen + 1);
883 MCOPY(namebuf + 1, component->name->text, char, namelen);
887 /* the component is a non-array class */
888 namebuf = DMNEW(char, namelen + 3);
891 MCOPY(namebuf + 2, component->name->text, char, namelen);
892 namebuf[2 + namelen] = ';';
896 u = utf_new(namebuf, namelen);
898 c = get_array_class(u, cl, cl, link);
900 dump_release(dumpsize);
906 /* class_multiarray_of *********************************************************
908 Returns an array class with the given dimension and element class.
909 The array class is dynamically created if neccessary.
911 *******************************************************************************/
913 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
920 dumpsize = dump_size();
923 log_text("Invalid array dimension requested");
927 /* Assemble the array class name */
928 namelen = element->name->blength;
930 if (element->name->text[0] == '[') {
931 /* the element is itself an array */
932 namebuf = DMNEW(char, namelen + dim);
933 memcpy(namebuf + dim, element->name->text, namelen);
937 /* the element is a non-array class */
938 namebuf = DMNEW(char, namelen + 2 + dim);
940 memcpy(namebuf + dim + 1, element->name->text, namelen);
941 namelen += (2 + dim);
942 namebuf[namelen - 1] = ';';
944 memset(namebuf, '[', dim);
946 c = get_array_class(utf_new(namebuf, namelen),
947 element->classloader,
948 element->classloader,
951 dump_release(dumpsize);
957 /* class_lookup_classref *******************************************************
959 Looks up the constant_classref for a given classname in the classref
963 cls..............the class containing the reference
964 name.............the name of the class refered to
967 a pointer to a constant_classref, or
968 NULL if the reference was not found
970 *******************************************************************************/
972 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
974 constant_classref *ref;
975 extra_classref *xref;
980 assert(!cls->classrefcount || cls->classrefs);
982 /* first search the main classref table */
983 count = cls->classrefcount;
984 ref = cls->classrefs;
985 for (; count; --count, ++ref)
986 if (ref->name == name)
989 /* next try the list of extra classrefs */
990 for (xref = cls->extclassrefs; xref; xref = xref->next) {
991 if (xref->classref.name == name)
992 return &(xref->classref);
1000 /* class_get_classref **********************************************************
1002 Returns the constant_classref for a given classname.
1005 cls..............the class containing the reference
1006 name.............the name of the class refered to
1009 a pointer to a constant_classref (never NULL)
1012 The given name is not checked for validity!
1014 *******************************************************************************/
1016 constant_classref *class_get_classref(classinfo *cls, utf *name)
1018 constant_classref *ref;
1019 extra_classref *xref;
1024 ref = class_lookup_classref(cls,name);
1028 xref = NEW(extra_classref);
1029 CLASSREF_INIT(xref->classref,cls,name);
1031 xref->next = cls->extclassrefs;
1032 cls->extclassrefs = xref;
1034 return &(xref->classref);
1038 /* class_get_self_classref *****************************************************
1040 Returns the constant_classref to the class itself.
1043 cls..............the class containing the reference
1046 a pointer to a constant_classref (never NULL)
1048 *******************************************************************************/
1050 constant_classref *class_get_self_classref(classinfo *cls)
1052 /* XXX this should be done in a faster way. Maybe always make */
1053 /* the classref of index 0 a self reference. */
1054 return class_get_classref(cls,cls->name);
1057 /* class_get_classref_multiarray_of ********************************************
1059 Returns an array type reference with the given dimension and element class
1063 dim..............the requested dimension
1064 dim must be in [1;255]. This is NOT checked!
1065 ref..............the component class reference
1068 a pointer to the class reference for the array type
1071 The referer of `ref` is used as the referer for the new classref.
1073 *******************************************************************************/
1075 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1080 constant_classref *cr;
1083 assert(dim >= 1 && dim <= 255);
1085 dumpsize = dump_size();
1087 /* Assemble the array class name */
1088 namelen = ref->name->blength;
1090 if (ref->name->text[0] == '[') {
1091 /* the element is itself an array */
1092 namebuf = DMNEW(char, namelen + dim);
1093 memcpy(namebuf + dim, ref->name->text, namelen);
1097 /* the element is a non-array class */
1098 namebuf = DMNEW(char, namelen + 2 + dim);
1100 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1101 namelen += (2 + dim);
1102 namebuf[namelen - 1] = ';';
1104 memset(namebuf, '[', dim);
1106 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1108 dump_release(dumpsize);
1114 /* class_get_classref_component_of *********************************************
1116 Returns the component classref of a given array type reference
1119 ref..............the array type reference
1122 a reference to the component class, or
1123 NULL if `ref` is not an object array type reference
1126 The referer of `ref` is used as the referer for the new classref.
1128 *******************************************************************************/
1130 constant_classref *class_get_classref_component_of(constant_classref *ref)
1137 name = ref->name->text;
1141 namelen = ref->name->blength - 1;
1146 else if (*name != '[') {
1150 return class_get_classref(ref->referer, utf_new(name, namelen));
1154 /* class_findmethod ************************************************************
1156 Searches a 'classinfo' structure for a method having the given name
1157 and descriptor. If descriptor is NULL, it is ignored.
1159 *******************************************************************************/
1161 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1166 for (i = 0; i < c->methodscount; i++) {
1167 m = &(c->methods[i]);
1169 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1177 /* class_resolvemethod *********************************************************
1179 Searches a class and it's super classes for a method.
1181 Superinterfaces are *not* searched.
1183 *******************************************************************************/
1185 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1190 m = class_findmethod(c, name, desc);
1195 /* JVM Specification bug:
1197 It is important NOT to resolve special <init> and <clinit>
1198 methods to super classes or interfaces; yet, this is not
1199 explicited in the specification. Section 5.4.3.3 should be
1200 updated appropriately. */
1202 if (name == utf_init || name == utf_clinit)
1212 /* class_resolveinterfacemethod_intern *****************************************
1214 Internally used helper function. Do not use this directly.
1216 *******************************************************************************/
1218 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1219 utf *name, utf *desc)
1224 /* try to find the method in the class */
1226 m = class_findmethod(c, name, desc);
1231 /* no method found? try the superinterfaces */
1233 for (i = 0; i < c->interfacescount; i++) {
1234 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1241 /* no method found */
1247 /* class_resolveclassmethod ****************************************************
1249 Resolves a reference from REFERER to a method with NAME and DESC in
1252 If the method cannot be resolved the return value is NULL. If
1253 EXCEPT is true *exceptionptr is set, too.
1255 *******************************************************************************/
1257 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1258 classinfo *referer, bool throwexception)
1264 /* if (c->flags & ACC_INTERFACE) { */
1265 /* if (throwexception) */
1266 /* *exceptionptr = */
1267 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1271 /* try class c and its superclasses */
1275 m = class_resolvemethod(cls, name, desc);
1280 /* try the superinterfaces */
1282 for (i = 0; i < c->interfacescount; i++) {
1283 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1291 exceptions_throw_nosuchmethoderror(c, name, desc);
1296 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1298 exceptions_throw_abstractmethoderror();
1303 /* XXX check access rights */
1309 /* class_resolveinterfacemethod ************************************************
1311 Resolves a reference from REFERER to a method with NAME and DESC in
1314 If the method cannot be resolved the return value is NULL. If
1315 EXCEPT is true *exceptionptr is set, too.
1317 *******************************************************************************/
1319 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1320 classinfo *referer, bool throwexception)
1324 if (!(c->flags & ACC_INTERFACE)) {
1326 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1331 mi = class_resolveinterfacemethod_intern(c, name, desc);
1336 /* try class java.lang.Object */
1338 mi = class_findmethod(class_java_lang_Object, name, desc);
1344 exceptions_throw_nosuchmethoderror(c, name, desc);
1350 /* class_findfield *************************************************************
1352 Searches for field with specified name and type in a classinfo
1353 structure. If no such field is found NULL is returned.
1355 *******************************************************************************/
1357 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1361 for (i = 0; i < c->fieldscount; i++)
1362 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1363 return &(c->fields[i]);
1366 return class_findfield(c->super.cls, name, desc);
1372 /* class_findfield_approx ******************************************************
1374 Searches in 'classinfo'-structure for a field with the specified
1377 *******************************************************************************/
1379 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1383 /* get field index */
1385 i = class_findfield_index_by_name(c, name);
1387 /* field was not found, return */
1392 /* return field address */
1394 return &(c->fields[i]);
1398 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1402 for (i = 0; i < c->fieldscount; i++) {
1403 /* compare field names */
1405 if ((c->fields[i].name == name))
1409 /* field was not found, raise exception */
1411 exceptions_throw_nosuchfielderror(c, name);
1417 /****************** Function: class_resolvefield_int ***************************
1419 This is an internally used helper function. Do not use this directly.
1421 Tries to resolve a field having the given name and type.
1422 If the field cannot be resolved, NULL is returned.
1424 *******************************************************************************/
1426 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1431 /* search for field in class c */
1433 for (i = 0; i < c->fieldscount; i++) {
1434 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1435 return &(c->fields[i]);
1439 /* try superinterfaces recursively */
1441 for (i = 0; i < c->interfacescount; i++) {
1442 fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
1447 /* try superclass */
1450 return class_resolvefield_int(c->super.cls, name, desc);
1458 /********************* Function: class_resolvefield ***************************
1460 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1462 If the field cannot be resolved the return value is NULL. If EXCEPT is
1463 true *exceptionptr is set, too.
1465 *******************************************************************************/
1467 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1468 classinfo *referer, bool throwexception)
1472 fi = class_resolvefield_int(c, name, desc);
1476 exceptions_throw_nosuchfielderror(c, name);
1481 /* XXX check access rights */
1487 /* class_resolve_superclass ****************************************************
1489 Resolves the super class reference of the given class if necessary.
1491 *******************************************************************************/
1493 static classinfo *class_resolve_superclass(classinfo *c)
1497 if (c->super.any == NULL)
1500 /* Do we have a super class reference or is it already
1503 if (IS_CLASSREF(c->super)) {
1504 super = resolve_classref_or_classinfo_eager(c->super, true);
1509 /* Store the resolved super class in the class structure. */
1511 c->super.cls = super;
1514 return c->super.cls;
1518 /* class_issubclass ************************************************************
1520 Checks if sub is a descendant of super.
1522 *******************************************************************************/
1524 bool class_issubclass(classinfo *sub, classinfo *super)
1533 sub = class_resolve_superclass(sub);
1538 /* class_isanysubclass *********************************************************
1540 Checks a subclass relation between two classes. Implemented
1541 interfaces are interpreted as super classes.
1543 Return value: 1 ... sub is subclass of super
1546 *******************************************************************************/
1548 bool class_isanysubclass(classinfo *sub, classinfo *super)
1550 castinfo classvalues;
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 ASM_GETCLASSVALUES_ATOMIC(super->vftbl, sub->vftbl, &classvalues);
1579 diffval = classvalues.sub_baseval - classvalues.super_baseval;
1580 result = diffval <= (u4) classvalues.super_diffval;
1587 /* class_is_primitive **********************************************************
1589 Checks if the given class is a primitive class.
1591 *******************************************************************************/
1593 bool class_is_primitive(classinfo *c)
1595 if (c->flags & ACC_CLASS_PRIMITIVE)
1602 /* class_is_array **************************************************************
1604 Checks if the given class is an array class.
1606 *******************************************************************************/
1608 bool class_is_array(classinfo *c)
1610 if (!(c->state & CLASS_LINKED))
1614 return (c->vftbl->arraydesc != NULL);
1618 /* class_is_interface **********************************************************
1620 Checks if the given class is an interface.
1622 *******************************************************************************/
1624 bool class_is_interface(classinfo *c)
1626 if (c->flags & ACC_INTERFACE)
1633 /* class_get_superclass ********************************************************
1635 Return the super class of the given class. If the super-field is a
1636 class-reference, resolve it and store it in the classinfo.
1638 *******************************************************************************/
1640 classinfo *class_get_superclass(classinfo *c)
1644 /* For java.lang.Object, primitive and Void classes we return
1647 if (c->super.any == NULL)
1650 /* For interfaces we also return NULL. */
1652 if (c->flags & ACC_INTERFACE)
1655 /* We may have to resolve the super class reference. */
1657 super = class_resolve_superclass(c);
1663 /* class_get_declaringclass ****************************************************
1665 If the class or interface given is a member of another class,
1666 return the declaring class. For array and primitive classes return
1669 *******************************************************************************/
1671 classinfo *class_get_declaringclass(classinfo *c)
1673 classref_or_classinfo innercr;
1675 classref_or_classinfo outercr;
1679 /* return NULL for arrayclasses and primitive classes */
1681 if (class_is_primitive(c) || (c->name->text[0] == '['))
1684 /* no innerclasses exist */
1686 if (c->innerclasscount == 0)
1689 for (i = 0; i < c->innerclasscount; i++) {
1690 /* Check if inner_class is a classref or a real class and get
1691 the class name from the structure. */
1693 innercr = c->innerclass[i].inner_class;
1695 innername = IS_CLASSREF(innercr) ?
1696 innercr.ref->name : innercr.cls->name;
1698 /* Is the current innerclass this class? */
1700 if (innername == c->name) {
1701 /* Maybe the outer class is not loaded yet. */
1703 outercr = c->innerclass[i].outer_class;
1705 outer = resolve_classref_or_classinfo_eager(outercr, false);
1710 if (!(outer->state & CLASS_LINKED))
1711 if (!link_class(outer))
1722 /* class_get_signature *********************************************************
1724 Return the signature of the given class. For array and primitive
1725 classes return NULL.
1727 *******************************************************************************/
1729 #if defined(ENABLE_JAVASE)
1730 utf *class_get_signature(classinfo *c)
1732 /* For array and primitive classes return NULL. */
1734 if (class_is_array(c) || class_is_primitive(c))
1737 return c->signature;
1742 /* class_printflags ************************************************************
1744 Prints flags of a class.
1746 *******************************************************************************/
1748 #if !defined(NDEBUG)
1749 void class_printflags(classinfo *c)
1756 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
1757 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
1758 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
1759 if (c->flags & ACC_STATIC) printf(" STATIC");
1760 if (c->flags & ACC_FINAL) printf(" FINAL");
1761 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
1762 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
1763 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
1764 if (c->flags & ACC_NATIVE) printf(" NATIVE");
1765 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
1766 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
1771 /* class_print *****************************************************************
1773 Prints classname plus flags.
1775 *******************************************************************************/
1777 #if !defined(NDEBUG)
1778 void class_print(classinfo *c)
1785 utf_display_printable_ascii(c->name);
1786 class_printflags(c);
1791 /* class_classref_print ********************************************************
1793 Prints classname plus referer class.
1795 *******************************************************************************/
1797 #if !defined(NDEBUG)
1798 void class_classref_print(constant_classref *cr)
1805 utf_display_printable_ascii(cr->name);
1808 class_print(cr->referer);
1816 /* class_println ***************************************************************
1818 Prints classname plus flags and new line.
1820 *******************************************************************************/
1822 #if !defined(NDEBUG)
1823 void class_println(classinfo *c)
1831 /* class_classref_println ******************************************************
1833 Prints classname plus referer class and new line.
1835 *******************************************************************************/
1837 #if !defined(NDEBUG)
1838 void class_classref_println(constant_classref *cr)
1840 class_classref_print(cr);
1846 /* class_classref_or_classinfo_print *******************************************
1848 Prints classname plus referer class.
1850 *******************************************************************************/
1852 #if !defined(NDEBUG)
1853 void class_classref_or_classinfo_print(classref_or_classinfo c)
1855 if (c.any == NULL) {
1856 printf("(classref_or_classinfo) NULL");
1860 class_classref_print(c.ref);
1867 /* class_classref_or_classinfo_println *****************************************
1869 Prints classname plus referer class and a newline.
1871 *******************************************************************************/
1873 void class_classref_or_classinfo_println(classref_or_classinfo c)
1875 class_classref_or_classinfo_println(c);
1880 /* class_showconstantpool ******************************************************
1882 Dump the constant pool of the given class to stdout.
1884 *******************************************************************************/
1886 #if !defined(NDEBUG)
1887 void class_showconstantpool (classinfo *c)
1892 printf ("---- dump of constant pool ----\n");
1894 for (i=0; i<c->cpcount; i++) {
1895 printf ("#%d: ", (int) i);
1897 e = c -> cpinfos [i];
1900 switch (c -> cptags [i]) {
1901 case CONSTANT_Class:
1902 printf ("Classreference -> ");
1903 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
1905 case CONSTANT_Fieldref:
1906 printf ("Fieldref -> ");
1907 field_fieldref_print((constant_FMIref *) e);
1909 case CONSTANT_Methodref:
1910 printf ("Methodref -> ");
1911 method_methodref_print((constant_FMIref *) e);
1913 case CONSTANT_InterfaceMethodref:
1914 printf ("InterfaceMethod -> ");
1915 method_methodref_print((constant_FMIref *) e);
1917 case CONSTANT_String:
1918 printf ("String -> ");
1919 utf_display_printable_ascii (e);
1921 case CONSTANT_Integer:
1922 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
1924 case CONSTANT_Float:
1925 printf ("Float -> %f", ((constant_float*)e) -> value);
1927 case CONSTANT_Double:
1928 printf ("Double -> %f", ((constant_double*)e) -> value);
1932 u8 v = ((constant_long*)e) -> value;
1934 printf ("Long -> %ld", (long int) v);
1936 printf ("Long -> HI: %ld, LO: %ld\n",
1937 (long int) v.high, (long int) v.low);
1941 case CONSTANT_NameAndType:
1943 constant_nameandtype *cnt = e;
1944 printf ("NameAndType: ");
1945 utf_display_printable_ascii (cnt->name);
1947 utf_display_printable_ascii (cnt->descriptor);
1951 printf ("Utf8 -> ");
1952 utf_display_printable_ascii (e);
1955 log_text("Invalid type of ConstantPool-Entry");
1963 #endif /* !defined(NDEBUG) */
1966 /* class_showmethods ***********************************************************
1968 Dump info about the fields and methods of the given class to stdout.
1970 *******************************************************************************/
1972 #if !defined(NDEBUG)
1973 void class_showmethods (classinfo *c)
1977 printf("--------- Fields and Methods ----------------\n");
1979 class_printflags(c);
1983 utf_display_printable_ascii(c->name);
1988 utf_display_printable_ascii(c->super.cls->name);
1992 printf("Index: %d\n", c->index);
1994 printf("Interfaces:\n");
1995 for (i = 0; i < c->interfacescount; i++) {
1997 utf_display_printable_ascii(c->interfaces[i].cls->name);
1998 printf (" (%d)\n", c->interfaces[i].cls->index);
2001 printf("Fields:\n");
2002 for (i = 0; i < c->fieldscount; i++)
2003 field_println(&(c->fields[i]));
2005 printf("Methods:\n");
2006 for (i = 0; i < c->methodscount; i++) {
2007 methodinfo *m = &(c->methods[i]);
2009 if (!(m->flags & ACC_STATIC))
2010 printf("vftblindex: %d ", m->vftblindex);
2015 printf ("Virtual function table:\n");
2016 for (i = 0; i < c->vftbl->vftbllength; i++)
2017 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2019 #endif /* !defined(NDEBUG) */
2023 * These are local overrides for various environment variables in Emacs.
2024 * Please do not remove this and leave it at the end of the file, where
2025 * Emacs will automagically detect them.
2026 * ---------------------------------------------------------------------
2029 * indent-tabs-mode: t
2033 * vim:noexpandtab:sw=4:ts=4: