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 8395 2007-08-22 13:12:46Z panzi $
41 #include "mm/memory.h"
43 #include "native/llni.h"
45 #include "threads/lock-common.h"
47 #include "toolbox/logging.h"
50 #include "vm/builtin.h"
51 #include "vm/exceptions.h"
52 #include "vm/global.h"
53 #include "vm/resolve.h"
55 #include "vm/jit/asmpart.h"
57 #include "vmcore/class.h"
58 #include "vmcore/classcache.h"
59 #include "vmcore/linker.h"
60 #include "vmcore/loader.h"
61 #include "vmcore/options.h"
63 #if defined(ENABLE_STATISTICS)
64 # include "vmcore/statistics.h"
67 #include "vmcore/suck.h"
68 #include "vmcore/utf8.h"
71 /* global variables ***********************************************************/
73 /* frequently used classes ****************************************************/
75 /* important system classes */
77 classinfo *class_java_lang_Object;
78 classinfo *class_java_lang_Class;
79 classinfo *class_java_lang_ClassLoader;
80 classinfo *class_java_lang_Cloneable;
81 classinfo *class_java_lang_SecurityManager;
82 classinfo *class_java_lang_String;
83 classinfo *class_java_lang_System;
84 classinfo *class_java_lang_Thread;
85 classinfo *class_java_lang_ThreadGroup;
86 classinfo *class_java_lang_VMSystem;
87 classinfo *class_java_lang_VMThread;
88 classinfo *class_java_io_Serializable;
90 #if defined(WITH_CLASSPATH_SUN)
91 classinfo *class_sun_reflect_MagicAccessorImpl;
94 /* system exception classes required in cacao */
96 classinfo *class_java_lang_Throwable;
97 classinfo *class_java_lang_Error;
98 classinfo *class_java_lang_LinkageError;
99 classinfo *class_java_lang_NoClassDefFoundError;
100 classinfo *class_java_lang_OutOfMemoryError;
101 classinfo *class_java_lang_VirtualMachineError;
103 #if defined(WITH_CLASSPATH_GNU)
104 classinfo *class_java_lang_VMThrowable;
107 classinfo *class_java_lang_Exception;
108 classinfo *class_java_lang_ClassCastException;
109 classinfo *class_java_lang_ClassNotFoundException;
111 #if defined(ENABLE_JAVASE)
112 classinfo *class_java_lang_Void;
114 classinfo *class_java_lang_Boolean;
115 classinfo *class_java_lang_Byte;
116 classinfo *class_java_lang_Character;
117 classinfo *class_java_lang_Short;
118 classinfo *class_java_lang_Integer;
119 classinfo *class_java_lang_Long;
120 classinfo *class_java_lang_Float;
121 classinfo *class_java_lang_Double;
124 /* some runtime exception */
126 classinfo *class_java_lang_NullPointerException;
129 /* some classes which may be used more often */
131 #if defined(ENABLE_JAVASE)
132 classinfo *class_java_lang_StackTraceElement;
133 classinfo *class_java_lang_reflect_Constructor;
134 classinfo *class_java_lang_reflect_Field;
135 classinfo *class_java_lang_reflect_Method;
136 classinfo *class_java_security_PrivilegedAction;
137 classinfo *class_java_util_Vector;
139 classinfo *arrayclass_java_lang_Object;
141 #if defined(ENABLE_ANNOTATIONS)
142 classinfo *class_sun_reflect_ConstantPool;
143 classinfo *class_sun_reflect_annotation_AnnotationParser;
148 /* pseudo classes for the typechecker */
150 classinfo *pseudo_class_Arraystub;
151 classinfo *pseudo_class_Null;
152 classinfo *pseudo_class_New;
155 /* class_set_packagename *******************************************************
157 Derive the package name from the class name and store it in the struct.
159 *******************************************************************************/
161 void class_set_packagename(classinfo *c)
163 char *p = UTF_END(c->name) - 1;
164 char *start = c->name->text;
166 /* set the package name */
167 /* classes in the unnamed package keep packagename == NULL */
169 if (c->name->text[0] == '[') {
170 /* set packagename of arrays to the element's package */
172 for (; *start == '['; start++);
174 /* skip the 'L' in arrays of references */
178 for (; (p > start) && (*p != '/'); --p);
180 c->packagename = utf_new(start, p - start);
183 for (; (p > start) && (*p != '/'); --p);
185 c->packagename = utf_new(start, p - start);
190 /* class_create_classinfo ******************************************************
192 Create a new classinfo struct. The class name is set to the given utf *,
193 most other fields are initialized to zero.
195 Note: classname may be NULL. In this case a not-yet-named classinfo is
196 created. The name must be filled in later and class_set_packagename
197 must be called after that.
199 *******************************************************************************/
201 classinfo *class_create_classinfo(utf *classname)
205 #if defined(ENABLE_STATISTICS)
207 size_classinfo += sizeof(classinfo);
210 /* we use a safe name for temporarily unnamed classes */
212 if (classname == NULL)
213 classname = utf_not_named_yet;
217 log_message_utf("Creating class: ", classname);
220 /* GCNEW_UNCOLLECTABLE clears the allocated memory */
222 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
223 /*c=NEW(classinfo);*/
226 /* Set the header.vftbl of all loaded classes to the one of
227 java.lang.Class, so Java code can use a class as object. */
229 if (class_java_lang_Class != NULL)
230 if (class_java_lang_Class->vftbl != NULL)
231 c->object.header.vftbl = class_java_lang_Class->vftbl;
233 #if defined(ENABLE_JAVASE)
234 /* check if the class is a reference class and flag it */
236 if (classname == utf_java_lang_ref_SoftReference) {
237 c->flags |= ACC_CLASS_REFERENCE_SOFT;
239 else if (classname == utf_java_lang_ref_WeakReference) {
240 c->flags |= ACC_CLASS_REFERENCE_WEAK;
242 else if (classname == utf_java_lang_ref_PhantomReference) {
243 c->flags |= ACC_CLASS_REFERENCE_PHANTOM;
247 if (classname != utf_not_named_yet)
248 class_set_packagename(c);
250 LOCK_INIT_OBJECT_LOCK(&c->object.header);
256 /* class_postset_header_vftbl **************************************************
258 Set the header.vftbl of all classes created before java.lang.Class
259 was linked. This is necessary that Java code can use a class as
262 *******************************************************************************/
264 void class_postset_header_vftbl(void)
268 classcache_name_entry *nmen;
269 classcache_class_entry *clsen;
271 assert(class_java_lang_Class);
273 for (slot = 0; slot < hashtable_classcache.size; slot++) {
274 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
276 for (; nmen; nmen = nmen->hashlink) {
277 /* iterate over all class entries */
279 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
282 /* now set the the vftbl */
284 if (c->object.header.vftbl == NULL)
285 c->object.header.vftbl = class_java_lang_Class->vftbl;
291 /* class_define ****************************************************************
293 Calls the loader and defines a class in the VM.
295 *******************************************************************************/
297 classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data, java_handle_t *pd)
304 /* check if this class has already been defined */
306 c = classcache_lookup_defined_or_initiated(cl, name);
309 exceptions_throw_linkageerror("duplicate class definition: ", c);
314 /* create a new classinfo struct */
316 c = class_create_classinfo(name);
318 #if defined(ENABLE_STATISTICS)
321 if (opt_getloadingtime)
325 /* build a classbuffer with the given data */
327 cb = NEW(classbuffer);
334 /* preset the defining classloader */
338 /* load the class from this buffer */
340 r = load_class_from_classbuffer(cb);
344 FREE(cb, classbuffer);
346 #if defined(ENABLE_STATISTICS)
349 if (opt_getloadingtime)
354 /* If return value is NULL, we had a problem and the class is
355 not loaded. Now free the allocated memory, otherwise we
356 could run into a DOS. */
363 #if defined(ENABLE_JAVASE)
364 # if defined(WITH_CLASSPATH_SUN)
365 /* Store the protection domain. */
367 c->protectiondomain = pd;
371 /* Store the newly defined class in the class cache. This call
372 also checks whether a class of the same name has already been
373 defined by the same defining loader, and if so, replaces the
374 newly created class by the one defined earlier. */
376 /* Important: The classinfo given to classcache_store must be
377 fully prepared because another thread may return
378 this pointer after the lookup at to top of this
379 function directly after the class cache lock has
382 c = classcache_store(cl, c, true);
388 /* class_load_attribute_sourcefile *********************************************
390 SourceFile_attribute {
391 u2 attribute_name_index;
396 *******************************************************************************/
398 static bool class_load_attribute_sourcefile(classbuffer *cb)
409 /* check buffer size */
411 if (!suck_check_classbuffer_size(cb, 4 + 2))
414 /* check attribute length */
416 attribute_length = suck_u4(cb);
418 if (attribute_length != 2) {
419 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
423 /* there can be no more than one SourceFile attribute */
425 if (c->sourcefile != NULL) {
426 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
432 sourcefile_index = suck_u2(cb);
433 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
435 if (sourcefile == NULL)
438 /* store sourcefile */
440 c->sourcefile = sourcefile;
446 /* class_load_attribute_enclosingmethod ****************************************
448 EnclosingMethod_attribute {
449 u2 attribute_name_index;
455 *******************************************************************************/
457 #if defined(ENABLE_JAVASE)
458 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
464 classref_or_classinfo cr;
465 constant_nameandtype *cn;
471 /* check buffer size */
473 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
476 /* check attribute length */
478 attribute_length = suck_u4(cb);
480 if (attribute_length != 4) {
481 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
485 /* there can be no more than one EnclosingMethod attribute */
487 if (c->enclosingmethod != NULL) {
488 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
492 /* get class index */
494 class_index = suck_u2(cb);
495 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
497 /* get method index */
499 method_index = suck_u2(cb);
500 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
502 /* store info in classinfo */
504 c->enclosingclass.any = cr.any;
505 c->enclosingmethod = cn;
509 #endif /* defined(ENABLE_JAVASE) */
512 /* class_load_attributes *******************************************************
514 Read attributes from ClassFile.
517 u2 attribute_name_index;
519 u1 info[attribute_length];
522 InnerClasses_attribute {
523 u2 attribute_name_index;
527 *******************************************************************************/
529 bool class_load_attributes(classbuffer *cb)
532 uint16_t attributes_count;
533 uint16_t attribute_name_index;
535 innerclassinfo *info;
536 classref_or_classinfo inner;
537 classref_or_classinfo outer;
544 /* get attributes count */
546 if (!suck_check_classbuffer_size(cb, 2))
549 attributes_count = suck_u2(cb);
551 for (i = 0; i < attributes_count; i++) {
552 /* get attribute name */
554 if (!suck_check_classbuffer_size(cb, 2))
557 attribute_name_index = suck_u2(cb);
559 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
561 if (attribute_name == NULL)
564 if (attribute_name == utf_InnerClasses) {
567 if (c->innerclass != NULL) {
568 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
572 if (!suck_check_classbuffer_size(cb, 4 + 2))
575 /* skip attribute length */
578 /* number of records */
579 c->innerclasscount = suck_u2(cb);
581 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
584 /* allocate memory for innerclass structure */
585 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
587 for (j = 0; j < c->innerclasscount; j++) {
588 /* The innerclass structure contains a class with an encoded
589 name, its defining scope, its simple name and a bitmask of
592 info = c->innerclass + j;
594 inner.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
595 outer.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
596 name = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
599 /* If the current inner-class is the currently loaded
600 class check for some special flags. */
602 if (inner.ref->name == c->name) {
603 /* If an inner-class is not a member, its
604 outer-class is NULL. */
606 if (outer.ref != NULL) {
607 c->flags |= ACC_CLASS_MEMBER;
609 /* A member class doesn't have an
610 EnclosingMethod attribute, so set the
611 enclosing-class to be the same as the
614 c->declaringclass = outer;
615 c->enclosingclass = outer;
618 /* If an inner-class is anonymous, its name is
622 c->flags |= ACC_CLASS_ANONYMOUS;
625 info->inner_class = inner;
626 info->outer_class = outer;
631 else if (attribute_name == utf_SourceFile) {
634 if (!class_load_attribute_sourcefile(cb))
637 #if defined(ENABLE_JAVASE)
638 else if (attribute_name == utf_EnclosingMethod) {
639 /* EnclosingMethod */
641 if (!class_load_attribute_enclosingmethod(cb))
644 else if (attribute_name == utf_Signature) {
647 if (!loader_load_attribute_signature(cb, &(c->signature)))
652 #if defined(ENABLE_ANNOTATIONS)
653 /* XXX We can't do a release with that enabled */
655 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
656 /* RuntimeVisibleAnnotations */
657 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
660 /* XXX RuntimeInvisibleAnnotations should only be loaded
661 * (or returned to Java) if some commandline options says so.
662 * Currently there is no such option available in cacao,
663 * therefore I load them allways (for testing purpose).
664 * Anyway, bytecode for RuntimeInvisibleAnnotations is only
665 * generated if you tell javac to do so. So in most cases
666 * there won't be any.
668 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
669 /* RuntimeInvisibleAnnotations */
670 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
676 /* unknown attribute */
678 if (!loader_skip_attribute_body(cb))
687 /* class_freepool **************************************************************
689 Frees all resources used by this classes Constant Pool.
691 *******************************************************************************/
693 static void class_freecpool(classinfo *c)
699 if (c->cptags && c->cpinfos) {
700 for (idx = 0; idx < c->cpcount; idx++) {
701 tag = c->cptags[idx];
702 info = c->cpinfos[idx];
706 case CONSTANT_Fieldref:
707 case CONSTANT_Methodref:
708 case CONSTANT_InterfaceMethodref:
709 FREE(info, constant_FMIref);
711 case CONSTANT_Integer:
712 FREE(info, constant_integer);
715 FREE(info, constant_float);
718 FREE(info, constant_long);
720 case CONSTANT_Double:
721 FREE(info, constant_double);
723 case CONSTANT_NameAndType:
724 FREE(info, constant_nameandtype);
732 MFREE(c->cptags, u1, c->cpcount);
735 MFREE(c->cpinfos, voidptr, c->cpcount);
739 /* class_getconstant ***********************************************************
741 Retrieves the value at position 'pos' of the constantpool of a
742 class. If the type of the value is other than 'ctype', an error is
745 *******************************************************************************/
747 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
749 /* check index and type of constantpool entry */
750 /* (pos == 0 is caught by type comparison) */
752 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
753 exceptions_throw_classformaterror(c, "Illegal constant pool index");
757 return c->cpinfos[pos];
761 /* innerclass_getconstant ******************************************************
763 Like class_getconstant, but if cptags is ZERO, null is returned.
765 *******************************************************************************/
767 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
769 /* invalid position in constantpool */
771 if (pos >= c->cpcount) {
772 exceptions_throw_classformaterror(c, "Illegal constant pool index");
776 /* constantpool entry of type 0 */
778 if (c->cptags[pos] == 0)
781 /* check type of constantpool entry */
783 if (c->cptags[pos] != ctype) {
784 exceptions_throw_classformaterror(c, "Illegal constant pool index");
788 return c->cpinfos[pos];
792 /* class_free ******************************************************************
794 Frees all resources used by the class.
796 *******************************************************************************/
798 void class_free(classinfo *c)
806 MFREE(c->interfaces, classinfo*, c->interfacescount);
809 for (i = 0; i < c->fieldscount; i++)
810 field_free(&(c->fields[i]));
811 #if defined(ENABLE_CACAO_GC)
812 MFREE(c->fields, fieldinfo, c->fieldscount);
817 for (i = 0; i < c->methodscount; i++)
818 method_free(&(c->methods[i]));
819 MFREE(c->methods, methodinfo, c->methodscount);
822 if ((v = c->vftbl) != NULL) {
824 mem_free(v->arraydesc,sizeof(arraydescriptor));
826 for (i = 0; i < v->interfacetablelength; i++) {
827 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
829 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
831 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
832 sizeof(methodptr*) * (v->interfacetablelength -
833 (v->interfacetablelength > 0));
834 v = (vftbl_t*) (((methodptr*) v) -
835 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
840 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
842 /* if (c->classvftbl)
843 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
847 #if defined(ENABLE_ANNOTATIONS)
848 annotation_bytearray_free(c->annotations);
850 annotation_bytearrays_free(c->method_annotations);
851 annotation_bytearrays_free(c->method_parameterannotations);
852 annotation_bytearrays_free(c->method_annotationdefaults);
854 annotation_bytearrays_free(c->field_annotations);
859 /* get_array_class *************************************************************
861 Returns the array class with the given name for the given
862 classloader, or NULL if an exception occurred.
864 Note: This function does eager loading.
866 *******************************************************************************/
868 static classinfo *get_array_class(utf *name,classloader *initloader,
869 classloader *defloader,bool link)
873 /* lookup this class in the classcache */
874 c = classcache_lookup(initloader,name);
876 c = classcache_lookup_defined(defloader,name);
879 /* we have to create it */
880 c = class_create_classinfo(name);
881 c = load_newly_created_array(c,initloader);
887 assert(c->state & CLASS_LOADED);
888 assert(c->classloader == defloader);
890 if (link && !(c->state & CLASS_LINKED))
894 assert(!link || (c->state & CLASS_LINKED));
900 /* class_array_of **************************************************************
902 Returns an array class with the given component class. The array
903 class is dynamically created if neccessary.
905 *******************************************************************************/
907 classinfo *class_array_of(classinfo *component, bool link)
916 cl = component->classloader;
918 dumpsize = dump_size();
920 /* Assemble the array class name */
921 namelen = component->name->blength;
923 if (component->name->text[0] == '[') {
924 /* the component is itself an array */
925 namebuf = DMNEW(char, namelen + 1);
927 MCOPY(namebuf + 1, component->name->text, char, namelen);
931 /* the component is a non-array class */
932 namebuf = DMNEW(char, namelen + 3);
935 MCOPY(namebuf + 2, component->name->text, char, namelen);
936 namebuf[2 + namelen] = ';';
940 u = utf_new(namebuf, namelen);
942 c = get_array_class(u, cl, cl, link);
944 dump_release(dumpsize);
950 /* class_multiarray_of *********************************************************
952 Returns an array class with the given dimension and element class.
953 The array class is dynamically created if neccessary.
955 *******************************************************************************/
957 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
964 dumpsize = dump_size();
967 log_text("Invalid array dimension requested");
971 /* Assemble the array class name */
972 namelen = element->name->blength;
974 if (element->name->text[0] == '[') {
975 /* the element is itself an array */
976 namebuf = DMNEW(char, namelen + dim);
977 memcpy(namebuf + dim, element->name->text, namelen);
981 /* the element is a non-array class */
982 namebuf = DMNEW(char, namelen + 2 + dim);
984 memcpy(namebuf + dim + 1, element->name->text, namelen);
985 namelen += (2 + dim);
986 namebuf[namelen - 1] = ';';
988 memset(namebuf, '[', dim);
990 c = get_array_class(utf_new(namebuf, namelen),
991 element->classloader,
992 element->classloader,
995 dump_release(dumpsize);
1001 /* class_lookup_classref *******************************************************
1003 Looks up the constant_classref for a given classname in the classref
1007 cls..............the class containing the reference
1008 name.............the name of the class refered to
1011 a pointer to a constant_classref, or
1012 NULL if the reference was not found
1014 *******************************************************************************/
1016 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
1018 constant_classref *ref;
1019 extra_classref *xref;
1024 assert(!cls->classrefcount || cls->classrefs);
1026 /* first search the main classref table */
1027 count = cls->classrefcount;
1028 ref = cls->classrefs;
1029 for (; count; --count, ++ref)
1030 if (ref->name == name)
1033 /* next try the list of extra classrefs */
1034 for (xref = cls->extclassrefs; xref; xref = xref->next) {
1035 if (xref->classref.name == name)
1036 return &(xref->classref);
1044 /* class_get_classref **********************************************************
1046 Returns the constant_classref for a given classname.
1049 cls..............the class containing the reference
1050 name.............the name of the class refered to
1053 a pointer to a constant_classref (never NULL)
1056 The given name is not checked for validity!
1058 *******************************************************************************/
1060 constant_classref *class_get_classref(classinfo *cls, utf *name)
1062 constant_classref *ref;
1063 extra_classref *xref;
1068 ref = class_lookup_classref(cls,name);
1072 xref = NEW(extra_classref);
1073 CLASSREF_INIT(xref->classref,cls,name);
1075 xref->next = cls->extclassrefs;
1076 cls->extclassrefs = xref;
1078 return &(xref->classref);
1082 /* class_get_self_classref *****************************************************
1084 Returns the constant_classref to the class itself.
1087 cls..............the class containing the reference
1090 a pointer to a constant_classref (never NULL)
1092 *******************************************************************************/
1094 constant_classref *class_get_self_classref(classinfo *cls)
1096 /* XXX this should be done in a faster way. Maybe always make */
1097 /* the classref of index 0 a self reference. */
1098 return class_get_classref(cls,cls->name);
1101 /* class_get_classref_multiarray_of ********************************************
1103 Returns an array type reference with the given dimension and element class
1107 dim..............the requested dimension
1108 dim must be in [1;255]. This is NOT checked!
1109 ref..............the component class reference
1112 a pointer to the class reference for the array type
1115 The referer of `ref` is used as the referer for the new classref.
1117 *******************************************************************************/
1119 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1124 constant_classref *cr;
1127 assert(dim >= 1 && dim <= 255);
1129 dumpsize = dump_size();
1131 /* Assemble the array class name */
1132 namelen = ref->name->blength;
1134 if (ref->name->text[0] == '[') {
1135 /* the element is itself an array */
1136 namebuf = DMNEW(char, namelen + dim);
1137 memcpy(namebuf + dim, ref->name->text, namelen);
1141 /* the element is a non-array class */
1142 namebuf = DMNEW(char, namelen + 2 + dim);
1144 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1145 namelen += (2 + dim);
1146 namebuf[namelen - 1] = ';';
1148 memset(namebuf, '[', dim);
1150 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1152 dump_release(dumpsize);
1158 /* class_get_classref_component_of *********************************************
1160 Returns the component classref of a given array type reference
1163 ref..............the array type reference
1166 a reference to the component class, or
1167 NULL if `ref` is not an object array type reference
1170 The referer of `ref` is used as the referer for the new classref.
1172 *******************************************************************************/
1174 constant_classref *class_get_classref_component_of(constant_classref *ref)
1181 name = ref->name->text;
1185 namelen = ref->name->blength - 1;
1190 else if (*name != '[') {
1194 return class_get_classref(ref->referer, utf_new(name, namelen));
1198 /* class_findmethod ************************************************************
1200 Searches a 'classinfo' structure for a method having the given name
1201 and descriptor. If descriptor is NULL, it is ignored.
1203 *******************************************************************************/
1205 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1210 for (i = 0; i < c->methodscount; i++) {
1211 m = &(c->methods[i]);
1213 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1221 /* class_resolvemethod *********************************************************
1223 Searches a class and it's super classes for a method.
1225 Superinterfaces are *not* searched.
1227 *******************************************************************************/
1229 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1234 m = class_findmethod(c, name, desc);
1239 /* JVM Specification bug:
1241 It is important NOT to resolve special <init> and <clinit>
1242 methods to super classes or interfaces; yet, this is not
1243 explicited in the specification. Section 5.4.3.3 should be
1244 updated appropriately. */
1246 if (name == utf_init || name == utf_clinit)
1256 /* class_resolveinterfacemethod_intern *****************************************
1258 Internally used helper function. Do not use this directly.
1260 *******************************************************************************/
1262 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1263 utf *name, utf *desc)
1268 /* try to find the method in the class */
1270 m = class_findmethod(c, name, desc);
1275 /* no method found? try the superinterfaces */
1277 for (i = 0; i < c->interfacescount; i++) {
1278 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1285 /* no method found */
1291 /* class_resolveclassmethod ****************************************************
1293 Resolves a reference from REFERER to a method with NAME and DESC in
1296 If the method cannot be resolved the return value is NULL. If
1297 EXCEPT is true *exceptionptr is set, too.
1299 *******************************************************************************/
1301 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1302 classinfo *referer, bool throwexception)
1308 /* if (c->flags & ACC_INTERFACE) { */
1309 /* if (throwexception) */
1310 /* *exceptionptr = */
1311 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1315 /* try class c and its superclasses */
1319 m = class_resolvemethod(cls, name, desc);
1324 /* try the superinterfaces */
1326 for (i = 0; i < c->interfacescount; i++) {
1327 m = class_resolveinterfacemethod_intern(c->interfaces[i].cls,
1335 exceptions_throw_nosuchmethoderror(c, name, desc);
1340 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1342 exceptions_throw_abstractmethoderror();
1347 /* XXX check access rights */
1353 /* class_resolveinterfacemethod ************************************************
1355 Resolves a reference from REFERER to a method with NAME and DESC in
1358 If the method cannot be resolved the return value is NULL. If
1359 EXCEPT is true *exceptionptr is set, too.
1361 *******************************************************************************/
1363 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1364 classinfo *referer, bool throwexception)
1368 if (!(c->flags & ACC_INTERFACE)) {
1370 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1375 mi = class_resolveinterfacemethod_intern(c, name, desc);
1380 /* try class java.lang.Object */
1382 mi = class_findmethod(class_java_lang_Object, name, desc);
1388 exceptions_throw_nosuchmethoderror(c, name, desc);
1394 /* class_findfield *************************************************************
1396 Searches for field with specified name and type in a classinfo
1397 structure. If no such field is found NULL is returned.
1399 *******************************************************************************/
1401 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
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]);
1410 return class_findfield(c->super.cls, name, desc);
1416 /* class_findfield_approx ******************************************************
1418 Searches in 'classinfo'-structure for a field with the specified
1421 *******************************************************************************/
1423 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1427 /* get field index */
1429 i = class_findfield_index_by_name(c, name);
1431 /* field was not found, return */
1436 /* return field address */
1438 return &(c->fields[i]);
1442 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1446 for (i = 0; i < c->fieldscount; i++) {
1447 /* compare field names */
1449 if ((c->fields[i].name == name))
1453 /* field was not found, raise exception */
1455 exceptions_throw_nosuchfielderror(c, name);
1461 /****************** Function: class_resolvefield_int ***************************
1463 This is an internally used helper function. Do not use this directly.
1465 Tries to resolve a field having the given name and type.
1466 If the field cannot be resolved, NULL is returned.
1468 *******************************************************************************/
1470 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1475 /* search for field in class c */
1477 for (i = 0; i < c->fieldscount; i++) {
1478 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1479 return &(c->fields[i]);
1483 /* try superinterfaces recursively */
1485 for (i = 0; i < c->interfacescount; i++) {
1486 fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
1491 /* try superclass */
1494 return class_resolvefield_int(c->super.cls, name, desc);
1502 /********************* Function: class_resolvefield ***************************
1504 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1506 If the field cannot be resolved the return value is NULL. If EXCEPT is
1507 true *exceptionptr is set, too.
1509 *******************************************************************************/
1511 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1512 classinfo *referer, bool throwexception)
1516 fi = class_resolvefield_int(c, name, desc);
1520 exceptions_throw_nosuchfielderror(c, name);
1525 /* XXX check access rights */
1531 /* class_resolve_superclass ****************************************************
1533 Resolves the super class reference of the given class if necessary.
1535 *******************************************************************************/
1537 static classinfo *class_resolve_superclass(classinfo *c)
1541 if (c->super.any == NULL)
1544 /* Check if the super class is a reference. */
1546 if (IS_CLASSREF(c->super)) {
1547 /* XXX I'm very sure this is not correct. */
1548 super = resolve_classref_or_classinfo_eager(c->super, true);
1549 /* super = resolve_classref_or_classinfo_eager(c->super, false); */
1554 /* Store the resolved super class in the class structure. */
1556 c->super.cls = super;
1559 return c->super.cls;
1563 /* class_issubclass ************************************************************
1565 Checks if sub is a descendant of super.
1567 *******************************************************************************/
1569 bool class_issubclass(classinfo *sub, classinfo *super)
1578 /* sub = class_resolve_superclass(sub); */
1579 if (sub->super.any == NULL)
1582 assert(IS_CLASSREF(sub->super) == 0);
1584 sub = sub->super.cls;
1589 /* class_isanysubclass *********************************************************
1591 Checks a subclass relation between two classes. Implemented
1592 interfaces are interpreted as super classes.
1594 Return value: 1 ... sub is subclass of super
1597 *******************************************************************************/
1599 bool class_isanysubclass(classinfo *sub, classinfo *super)
1604 /* This is the trivial case. */
1609 /* Primitive classes are only subclasses of themselves. */
1611 if (class_is_primitive(sub) || class_is_primitive(super))
1614 /* Check for interfaces. */
1616 if (super->flags & ACC_INTERFACE) {
1617 result = (sub->vftbl->interfacetablelength > super->index) &&
1618 (sub->vftbl->interfacetable[-super->index] != NULL);
1621 /* java.lang.Object is the only super class of any
1624 if (sub->flags & ACC_INTERFACE)
1625 return (super == class_java_lang_Object);
1627 LOCK_MONITOR_ENTER(linker_classrenumber_lock);
1629 diffval = sub->vftbl->baseval - super->vftbl->baseval;
1630 result = diffval <= (uint32_t) super->vftbl->diffval;
1632 LOCK_MONITOR_EXIT(linker_classrenumber_lock);
1639 /* class_is_primitive **********************************************************
1641 Checks if the given class is a primitive class.
1643 *******************************************************************************/
1645 bool class_is_primitive(classinfo *c)
1647 if (c->flags & ACC_CLASS_PRIMITIVE)
1654 /* class_is_anonymousclass *****************************************************
1656 Checks if the given class is an anonymous class.
1658 *******************************************************************************/
1660 bool class_is_anonymousclass(classinfo *c)
1662 if (c->flags & ACC_CLASS_ANONYMOUS)
1669 /* class_is_array **************************************************************
1671 Checks if the given class is an array class.
1673 *******************************************************************************/
1675 bool class_is_array(classinfo *c)
1677 if (!(c->state & CLASS_LINKED))
1681 return (c->vftbl->arraydesc != NULL);
1685 /* class_is_interface **********************************************************
1687 Checks if the given class is an interface.
1689 *******************************************************************************/
1691 bool class_is_interface(classinfo *c)
1693 if (c->flags & ACC_INTERFACE)
1700 /* class_is_localclass *********************************************************
1702 Checks if the given class is a local class.
1704 *******************************************************************************/
1706 bool class_is_localclass(classinfo *c)
1708 if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
1715 /* class_is_memberclass ********************************************************
1717 Checks if the given class is a member class.
1719 *******************************************************************************/
1721 bool class_is_memberclass(classinfo *c)
1723 if (c->flags & ACC_CLASS_MEMBER)
1730 /* class_get_superclass ********************************************************
1732 Return the super class of the given class. If the super-field is a
1733 class-reference, resolve it and store it in the classinfo.
1735 *******************************************************************************/
1737 classinfo *class_get_superclass(classinfo *c)
1741 /* For java.lang.Object, primitive and Void classes we return
1744 if (c->super.any == NULL)
1747 /* For interfaces we also return NULL. */
1749 if (c->flags & ACC_INTERFACE)
1752 /* We may have to resolve the super class reference. */
1754 super = class_resolve_superclass(c);
1760 /* class_get_componenttype *****************************************************
1762 Return the component class of the given class. If the given class
1763 is not an array, return NULL.
1765 *******************************************************************************/
1767 classinfo *class_get_componenttype(classinfo *c)
1769 classinfo *component;
1770 arraydescriptor *ad;
1772 /* XXX maybe we could find a way to do this without linking. */
1773 /* This way should be safe and easy, however. */
1775 if (!(c->state & CLASS_LINKED))
1779 ad = c->vftbl->arraydesc;
1784 if (ad->arraytype == ARRAYTYPE_OBJECT)
1785 component = ad->componentvftbl->class;
1787 component = primitive_class_get_by_type(ad->arraytype);
1793 /* class_get_declaredclasses ***************************************************
1795 Return an array of declared classes of the given class.
1797 *******************************************************************************/
1799 java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly)
1801 classref_or_classinfo inner;
1802 classref_or_classinfo outer;
1804 int declaredclasscount; /* number of declared classes */
1805 int pos; /* current declared class */
1806 java_handle_objectarray_t *oa; /* array of declared classes */
1810 declaredclasscount = 0;
1812 if (!class_is_primitive(c) && !class_is_array(c)) {
1813 /* Determine number of declared classes. */
1815 for (i = 0; i < c->innerclasscount; i++) {
1816 /* Get outer-class. If the inner-class is not a member
1817 class, the outer-class is NULL. */
1819 outer = c->innerclass[i].outer_class;
1821 if (outer.any == NULL)
1824 /* Check if outer-class is a classref or a real class and
1825 get the class name from the structure. */
1827 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1829 /* Outer class is this class. */
1831 if ((outername == c->name) &&
1832 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC)))
1833 declaredclasscount++;
1837 /* Allocate Class[] and check for OOM. */
1839 oa = builtin_anewarray(declaredclasscount, class_java_lang_Class);
1844 for (i = 0, pos = 0; i < c->innerclasscount; i++) {
1845 inner = c->innerclass[i].inner_class;
1846 outer = c->innerclass[i].outer_class;
1848 /* Get outer-class. If the inner-class is not a member class,
1849 the outer-class is NULL. */
1851 if (outer.any == NULL)
1854 /* Check if outer_class is a classref or a real class and get
1855 the class name from the structure. */
1857 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1859 /* Outer class is this class. */
1861 if ((outername == c->name) &&
1862 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC))) {
1864 ic = resolve_classref_or_classinfo_eager(inner, false);
1869 if (!(ic->state & CLASS_LINKED))
1870 if (!link_class(ic))
1873 LLNI_array_direct(oa, pos++) = (java_object_t *) ic;
1881 /* class_get_declaringclass ****************************************************
1883 If the class or interface given is a member of another class,
1884 return the declaring class. For array and primitive classes return
1887 *******************************************************************************/
1889 classinfo *class_get_declaringclass(classinfo *c)
1891 classref_or_classinfo cr;
1894 /* Get declaring class. */
1896 cr = c->declaringclass;
1901 /* Resolve the class if necessary. */
1903 if (IS_CLASSREF(cr)) {
1904 /* dc = resolve_classref_eager(cr.ref); */
1905 dc = resolve_classref_or_classinfo_eager(cr, true);
1910 /* Store the resolved class in the class structure. */
1921 /* class_get_enclosingclass ****************************************************
1923 Return the enclosing class for the given class.
1925 *******************************************************************************/
1927 classinfo *class_get_enclosingclass(classinfo *c)
1929 classref_or_classinfo cr;
1932 /* Get enclosing class. */
1934 cr = c->enclosingclass;
1939 /* Resolve the class if necessary. */
1941 if (IS_CLASSREF(cr)) {
1942 /* ec = resolve_classref_eager(cr.ref); */
1943 ec = resolve_classref_or_classinfo_eager(cr, true);
1948 /* Store the resolved class in the class structure. */
1959 /* class_get_interfaces ********************************************************
1961 Return an array of interfaces of the given class.
1963 *******************************************************************************/
1965 java_handle_objectarray_t *class_get_interfaces(classinfo *c)
1968 java_handle_objectarray_t *oa;
1971 if (!(c->state & CLASS_LINKED))
1975 oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
1980 for (i = 0; i < c->interfacescount; i++) {
1981 ic = c->interfaces[i].cls;
1983 LLNI_array_direct(oa, i) = (java_object_t *) ic;
1990 /* class_get_annotations *******************************************************
1992 Return the unparsed declared annotations in an byte array
1993 of the given class (or NULL if there aren't any).
1995 *******************************************************************************/
1997 java_handle_bytearray_t *class_get_annotations(classinfo *c)
1999 #if defined(ENABLE_ANNOTATIONS)
2000 java_handle_bytearray_t *annotations = NULL;
2003 /* Return null for arrays and primitives: */
2004 if (class_is_primitive(c) || class_is_array(c)) {
2008 /* copy the annotations into a java byte array: */
2009 if (c->annotations != NULL) {
2010 size = c->annotations->size;
2011 annotations = builtin_newarray_byte(size);
2013 if(annotations != NULL) {
2014 MCOPY(annotations->data, c->annotations->data, uint8_t, size);
2025 /* class_get_signature *********************************************************
2027 Return the signature of the given class. For array and primitive
2028 classes return NULL.
2030 *******************************************************************************/
2032 #if defined(ENABLE_JAVASE)
2033 utf *class_get_signature(classinfo *c)
2035 /* For array and primitive classes return NULL. */
2037 if (class_is_array(c) || class_is_primitive(c))
2040 return c->signature;
2045 /* class_printflags ************************************************************
2047 Prints flags of a class.
2049 *******************************************************************************/
2051 #if !defined(NDEBUG)
2052 void class_printflags(classinfo *c)
2059 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
2060 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
2061 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
2062 if (c->flags & ACC_STATIC) printf(" STATIC");
2063 if (c->flags & ACC_FINAL) printf(" FINAL");
2064 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
2065 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
2066 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
2067 if (c->flags & ACC_NATIVE) printf(" NATIVE");
2068 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
2069 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
2074 /* class_print *****************************************************************
2076 Prints classname plus flags.
2078 *******************************************************************************/
2080 #if !defined(NDEBUG)
2081 void class_print(classinfo *c)
2088 utf_display_printable_ascii(c->name);
2089 class_printflags(c);
2094 /* class_classref_print ********************************************************
2096 Prints classname plus referer class.
2098 *******************************************************************************/
2100 #if !defined(NDEBUG)
2101 void class_classref_print(constant_classref *cr)
2108 utf_display_printable_ascii(cr->name);
2111 class_print(cr->referer);
2119 /* class_println ***************************************************************
2121 Prints classname plus flags and new line.
2123 *******************************************************************************/
2125 #if !defined(NDEBUG)
2126 void class_println(classinfo *c)
2134 /* class_classref_println ******************************************************
2136 Prints classname plus referer class and new line.
2138 *******************************************************************************/
2140 #if !defined(NDEBUG)
2141 void class_classref_println(constant_classref *cr)
2143 class_classref_print(cr);
2149 /* class_classref_or_classinfo_print *******************************************
2151 Prints classname plus referer class.
2153 *******************************************************************************/
2155 #if !defined(NDEBUG)
2156 void class_classref_or_classinfo_print(classref_or_classinfo c)
2158 if (c.any == NULL) {
2159 printf("(classref_or_classinfo) NULL");
2163 class_classref_print(c.ref);
2170 /* class_classref_or_classinfo_println *****************************************
2172 Prints classname plus referer class and a newline.
2174 *******************************************************************************/
2176 void class_classref_or_classinfo_println(classref_or_classinfo c)
2178 class_classref_or_classinfo_println(c);
2183 /* class_showconstantpool ******************************************************
2185 Dump the constant pool of the given class to stdout.
2187 *******************************************************************************/
2189 #if !defined(NDEBUG)
2190 void class_showconstantpool (classinfo *c)
2195 printf ("---- dump of constant pool ----\n");
2197 for (i=0; i<c->cpcount; i++) {
2198 printf ("#%d: ", (int) i);
2200 e = c -> cpinfos [i];
2203 switch (c -> cptags [i]) {
2204 case CONSTANT_Class:
2205 printf ("Classreference -> ");
2206 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
2208 case CONSTANT_Fieldref:
2209 printf ("Fieldref -> ");
2210 field_fieldref_print((constant_FMIref *) e);
2212 case CONSTANT_Methodref:
2213 printf ("Methodref -> ");
2214 method_methodref_print((constant_FMIref *) e);
2216 case CONSTANT_InterfaceMethodref:
2217 printf ("InterfaceMethod -> ");
2218 method_methodref_print((constant_FMIref *) e);
2220 case CONSTANT_String:
2221 printf ("String -> ");
2222 utf_display_printable_ascii (e);
2224 case CONSTANT_Integer:
2225 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
2227 case CONSTANT_Float:
2228 printf ("Float -> %f", ((constant_float*)e) -> value);
2230 case CONSTANT_Double:
2231 printf ("Double -> %f", ((constant_double*)e) -> value);
2235 u8 v = ((constant_long*)e) -> value;
2237 printf ("Long -> %ld", (long int) v);
2239 printf ("Long -> HI: %ld, LO: %ld\n",
2240 (long int) v.high, (long int) v.low);
2244 case CONSTANT_NameAndType:
2246 constant_nameandtype *cnt = e;
2247 printf ("NameAndType: ");
2248 utf_display_printable_ascii (cnt->name);
2250 utf_display_printable_ascii (cnt->descriptor);
2254 printf ("Utf8 -> ");
2255 utf_display_printable_ascii (e);
2258 log_text("Invalid type of ConstantPool-Entry");
2266 #endif /* !defined(NDEBUG) */
2269 /* class_showmethods ***********************************************************
2271 Dump info about the fields and methods of the given class to stdout.
2273 *******************************************************************************/
2275 #if !defined(NDEBUG)
2276 void class_showmethods (classinfo *c)
2280 printf("--------- Fields and Methods ----------------\n");
2282 class_printflags(c);
2286 utf_display_printable_ascii(c->name);
2291 utf_display_printable_ascii(c->super.cls->name);
2295 printf("Index: %d\n", c->index);
2297 printf("Interfaces:\n");
2298 for (i = 0; i < c->interfacescount; i++) {
2300 utf_display_printable_ascii(c->interfaces[i].cls->name);
2301 printf (" (%d)\n", c->interfaces[i].cls->index);
2304 printf("Fields:\n");
2305 for (i = 0; i < c->fieldscount; i++)
2306 field_println(&(c->fields[i]));
2308 printf("Methods:\n");
2309 for (i = 0; i < c->methodscount; i++) {
2310 methodinfo *m = &(c->methods[i]);
2312 if (!(m->flags & ACC_STATIC))
2313 printf("vftblindex: %d ", m->vftblindex);
2318 printf ("Virtual function table:\n");
2319 for (i = 0; i < c->vftbl->vftbllength; i++)
2320 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2322 #endif /* !defined(NDEBUG) */
2326 * These are local overrides for various environment variables in Emacs.
2327 * Please do not remove this and leave it at the end of the file, where
2328 * Emacs will automagically detect them.
2329 * ---------------------------------------------------------------------
2332 * indent-tabs-mode: t
2336 * vim:noexpandtab:sw=4:ts=4: