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
39 #include "mm/memory.h"
41 #include "native/llni.h"
43 #include "threads/lock-common.h"
45 #include "toolbox/logging.h"
48 #include "vm/builtin.h"
49 #include "vm/exceptions.h"
50 #include "vm/global.h"
51 #include "vm/resolve.h"
53 #include "vm/jit/asmpart.h"
55 #include "vmcore/class.h"
56 #include "vmcore/classcache.h"
57 #include "vmcore/linker.h"
58 #include "vmcore/loader.h"
59 #include "vmcore/options.h"
61 #if defined(ENABLE_STATISTICS)
62 # include "vmcore/statistics.h"
65 #include "vmcore/suck.h"
66 #include "vmcore/utf8.h"
69 /* global variables ***********************************************************/
71 /* frequently used classes ****************************************************/
73 /* important system classes */
75 classinfo *class_java_lang_Object;
76 classinfo *class_java_lang_Class;
77 classinfo *class_java_lang_ClassLoader;
78 classinfo *class_java_lang_Cloneable;
79 classinfo *class_java_lang_SecurityManager;
80 classinfo *class_java_lang_String;
81 classinfo *class_java_lang_System;
82 classinfo *class_java_lang_Thread;
83 classinfo *class_java_lang_ThreadGroup;
84 classinfo *class_java_lang_VMSystem;
85 classinfo *class_java_lang_VMThread;
86 classinfo *class_java_io_Serializable;
88 #if defined(WITH_CLASSPATH_SUN)
89 classinfo *class_sun_reflect_MagicAccessorImpl;
92 /* system exception classes required in cacao */
94 classinfo *class_java_lang_Throwable;
95 classinfo *class_java_lang_Error;
96 classinfo *class_java_lang_LinkageError;
97 classinfo *class_java_lang_NoClassDefFoundError;
98 classinfo *class_java_lang_OutOfMemoryError;
99 classinfo *class_java_lang_VirtualMachineError;
101 #if defined(WITH_CLASSPATH_GNU)
102 classinfo *class_java_lang_VMThrowable;
105 classinfo *class_java_lang_Exception;
106 classinfo *class_java_lang_ClassCastException;
107 classinfo *class_java_lang_ClassNotFoundException;
109 #if defined(ENABLE_JAVASE)
110 classinfo *class_java_lang_Void;
112 classinfo *class_java_lang_Boolean;
113 classinfo *class_java_lang_Byte;
114 classinfo *class_java_lang_Character;
115 classinfo *class_java_lang_Short;
116 classinfo *class_java_lang_Integer;
117 classinfo *class_java_lang_Long;
118 classinfo *class_java_lang_Float;
119 classinfo *class_java_lang_Double;
122 /* some runtime exception */
124 classinfo *class_java_lang_NullPointerException;
127 /* some classes which may be used more often */
129 #if defined(ENABLE_JAVASE)
130 classinfo *class_java_lang_StackTraceElement;
131 classinfo *class_java_lang_reflect_Constructor;
132 classinfo *class_java_lang_reflect_Field;
133 classinfo *class_java_lang_reflect_Method;
134 classinfo *class_java_security_PrivilegedAction;
135 classinfo *class_java_util_Vector;
137 classinfo *arrayclass_java_lang_Object;
139 #if defined(ENABLE_ANNOTATIONS)
140 classinfo *class_sun_reflect_ConstantPool;
141 #if defined(WITH_CLASSPATH_GNU)
142 classinfo *class_sun_reflect_annotation_AnnotationParser;
148 /* pseudo classes for the typechecker */
150 classinfo *pseudo_class_Arraystub;
151 classinfo *pseudo_class_Null;
152 classinfo *pseudo_class_New;
155 /* class_set_packagename *******************************************************
157 Derive the package name from the class name and store it in the struct.
159 *******************************************************************************/
161 void class_set_packagename(classinfo *c)
163 char *p = UTF_END(c->name) - 1;
164 char *start = c->name->text;
166 /* set the package name */
167 /* classes in the unnamed package keep packagename == NULL */
169 if (c->name->text[0] == '[') {
170 /* set packagename of arrays to the element's package */
172 for (; *start == '['; start++);
174 /* skip the 'L' in arrays of references */
178 for (; (p > start) && (*p != '/'); --p);
180 c->packagename = utf_new(start, p - start);
183 for (; (p > start) && (*p != '/'); --p);
185 c->packagename = utf_new(start, p - start);
190 /* class_create_classinfo ******************************************************
192 Create a new classinfo struct. The class name is set to the given utf *,
193 most other fields are initialized to zero.
195 Note: classname may be NULL. In this case a not-yet-named classinfo is
196 created. The name must be filled in later and class_set_packagename
197 must be called after that.
199 *******************************************************************************/
201 classinfo *class_create_classinfo(utf *classname)
205 #if defined(ENABLE_STATISTICS)
207 size_classinfo += sizeof(classinfo);
210 /* we use a safe name for temporarily unnamed classes */
212 if (classname == NULL)
213 classname = utf_not_named_yet;
217 log_message_utf("Creating class: ", classname);
220 /* GCNEW_UNCOLLECTABLE clears the allocated memory */
222 #if defined(ENABLE_GC_CACAO)
223 c = (classinfo *) heap_alloc_uncollectable(sizeof(classinfo));
225 c = GCNEW_UNCOLLECTABLE(classinfo, 1);
226 /*c=NEW(classinfo);*/
230 /* Set the header.vftbl of all loaded classes to the one of
231 java.lang.Class, so Java code can use a class as object. */
233 if (class_java_lang_Class != NULL)
234 if (class_java_lang_Class->vftbl != NULL)
235 c->object.header.vftbl = class_java_lang_Class->vftbl;
237 #if defined(ENABLE_JAVASE)
238 /* check if the class is a reference class and flag it */
240 if (classname == utf_java_lang_ref_SoftReference) {
241 c->flags |= ACC_CLASS_REFERENCE_SOFT;
243 else if (classname == utf_java_lang_ref_WeakReference) {
244 c->flags |= ACC_CLASS_REFERENCE_WEAK;
246 else if (classname == utf_java_lang_ref_PhantomReference) {
247 c->flags |= ACC_CLASS_REFERENCE_PHANTOM;
251 if (classname != utf_not_named_yet)
252 class_set_packagename(c);
254 LOCK_INIT_OBJECT_LOCK(&c->object.header);
260 /* class_postset_header_vftbl **************************************************
262 Set the header.vftbl of all classes created before java.lang.Class
263 was linked. This is necessary that Java code can use a class as
266 *******************************************************************************/
268 void class_postset_header_vftbl(void)
272 classcache_name_entry *nmen;
273 classcache_class_entry *clsen;
275 assert(class_java_lang_Class);
277 for (slot = 0; slot < hashtable_classcache.size; slot++) {
278 nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
280 for (; nmen; nmen = nmen->hashlink) {
281 /* iterate over all class entries */
283 for (clsen = nmen->classes; clsen; clsen = clsen->next) {
286 /* now set the the vftbl */
288 if (c->object.header.vftbl == NULL)
289 c->object.header.vftbl = class_java_lang_Class->vftbl;
295 /* class_define ****************************************************************
297 Calls the loader and defines a class in the VM.
299 *******************************************************************************/
301 classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data, java_handle_t *pd)
308 /* check if this class has already been defined */
310 c = classcache_lookup_defined_or_initiated(cl, name);
313 exceptions_throw_linkageerror("duplicate class definition: ", c);
318 /* create a new classinfo struct */
320 c = class_create_classinfo(name);
322 #if defined(ENABLE_STATISTICS)
325 if (opt_getloadingtime)
329 /* build a classbuffer with the given data */
331 cb = NEW(classbuffer);
338 /* preset the defining classloader */
342 /* load the class from this buffer */
344 r = load_class_from_classbuffer(cb);
348 FREE(cb, classbuffer);
350 #if defined(ENABLE_STATISTICS)
353 if (opt_getloadingtime)
358 /* If return value is NULL, we had a problem and the class is
359 not loaded. Now free the allocated memory, otherwise we
360 could run into a DOS. */
367 #if defined(ENABLE_JAVASE)
368 # if defined(WITH_CLASSPATH_SUN)
369 /* Store the protection domain. */
371 c->protectiondomain = pd;
375 /* Store the newly defined class in the class cache. This call
376 also checks whether a class of the same name has already been
377 defined by the same defining loader, and if so, replaces the
378 newly created class by the one defined earlier. */
380 /* Important: The classinfo given to classcache_store must be
381 fully prepared because another thread may return
382 this pointer after the lookup at to top of this
383 function directly after the class cache lock has
386 c = classcache_store(cl, c, true);
392 /* class_load_attribute_sourcefile *********************************************
394 SourceFile_attribute {
395 u2 attribute_name_index;
400 *******************************************************************************/
402 static bool class_load_attribute_sourcefile(classbuffer *cb)
413 /* check buffer size */
415 if (!suck_check_classbuffer_size(cb, 4 + 2))
418 /* check attribute length */
420 attribute_length = suck_u4(cb);
422 if (attribute_length != 2) {
423 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
427 /* there can be no more than one SourceFile attribute */
429 if (c->sourcefile != NULL) {
430 exceptions_throw_classformaterror(c, "Multiple SourceFile attributes");
436 sourcefile_index = suck_u2(cb);
437 sourcefile = class_getconstant(c, sourcefile_index, CONSTANT_Utf8);
439 if (sourcefile == NULL)
442 /* store sourcefile */
444 c->sourcefile = sourcefile;
450 /* class_load_attribute_enclosingmethod ****************************************
452 EnclosingMethod_attribute {
453 u2 attribute_name_index;
459 *******************************************************************************/
461 #if defined(ENABLE_JAVASE)
462 static bool class_load_attribute_enclosingmethod(classbuffer *cb)
468 classref_or_classinfo cr;
469 constant_nameandtype *cn;
475 /* check buffer size */
477 if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
480 /* check attribute length */
482 attribute_length = suck_u4(cb);
484 if (attribute_length != 4) {
485 exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
489 /* there can be no more than one EnclosingMethod attribute */
491 if (c->enclosingmethod != NULL) {
492 exceptions_throw_classformaterror(c, "Multiple EnclosingMethod attributes");
496 /* get class index */
498 class_index = suck_u2(cb);
499 cr.ref = innerclass_getconstant(c, class_index, CONSTANT_Class);
501 /* get method index */
503 method_index = suck_u2(cb);
504 cn = innerclass_getconstant(c, method_index, CONSTANT_NameAndType);
506 /* store info in classinfo */
508 c->enclosingclass.any = cr.any;
509 c->enclosingmethod = cn;
513 #endif /* defined(ENABLE_JAVASE) */
516 /* class_load_attributes *******************************************************
518 Read attributes from ClassFile.
521 u2 attribute_name_index;
523 u1 info[attribute_length];
526 InnerClasses_attribute {
527 u2 attribute_name_index;
531 *******************************************************************************/
533 bool class_load_attributes(classbuffer *cb)
536 uint16_t attributes_count;
537 uint16_t attribute_name_index;
539 innerclassinfo *info;
540 classref_or_classinfo inner;
541 classref_or_classinfo outer;
548 /* get attributes count */
550 if (!suck_check_classbuffer_size(cb, 2))
553 attributes_count = suck_u2(cb);
555 for (i = 0; i < attributes_count; i++) {
556 /* get attribute name */
558 if (!suck_check_classbuffer_size(cb, 2))
561 attribute_name_index = suck_u2(cb);
563 class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
565 if (attribute_name == NULL)
568 if (attribute_name == utf_InnerClasses) {
571 if (c->innerclass != NULL) {
572 exceptions_throw_classformaterror(c, "Multiple InnerClasses attributes");
576 if (!suck_check_classbuffer_size(cb, 4 + 2))
579 /* skip attribute length */
582 /* number of records */
583 c->innerclasscount = suck_u2(cb);
585 if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * c->innerclasscount))
588 /* allocate memory for innerclass structure */
589 c->innerclass = MNEW(innerclassinfo, c->innerclasscount);
591 for (j = 0; j < c->innerclasscount; j++) {
592 /* The innerclass structure contains a class with an encoded
593 name, its defining scope, its simple name and a bitmask of
596 info = c->innerclass + j;
598 inner.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
599 outer.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
600 name = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
603 /* If the current inner-class is the currently loaded
604 class check for some special flags. */
606 if (inner.ref->name == c->name) {
607 /* If an inner-class is not a member, its
608 outer-class is NULL. */
610 if (outer.ref != NULL) {
611 c->flags |= ACC_CLASS_MEMBER;
613 /* A member class doesn't have an
614 EnclosingMethod attribute, so set the
615 enclosing-class to be the same as the
618 c->declaringclass = outer;
619 c->enclosingclass = outer;
622 /* If an inner-class is anonymous, its name is
626 c->flags |= ACC_CLASS_ANONYMOUS;
629 info->inner_class = inner;
630 info->outer_class = outer;
635 else if (attribute_name == utf_SourceFile) {
638 if (!class_load_attribute_sourcefile(cb))
641 #if defined(ENABLE_JAVASE)
642 else if (attribute_name == utf_EnclosingMethod) {
643 /* EnclosingMethod */
645 if (!class_load_attribute_enclosingmethod(cb))
648 else if (attribute_name == utf_Signature) {
651 if (!loader_load_attribute_signature(cb, &(c->signature)))
656 #if defined(ENABLE_ANNOTATIONS)
657 /* XXX We can't do a release with that enabled */
659 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
660 /* RuntimeVisibleAnnotations */
661 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
664 /* XXX RuntimeInvisibleAnnotations should only be loaded
665 * (or returned to Java) if some commandline options says so.
666 * Currently there is no such option available in cacao,
667 * therefore I load them allways (for testing purpose).
668 * Anyway, bytecode for RuntimeInvisibleAnnotations is only
669 * generated if you tell javac to do so. So in most cases
670 * there won't be any.
672 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
673 /* RuntimeInvisibleAnnotations */
674 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
680 /* unknown attribute */
682 if (!loader_skip_attribute_body(cb))
691 /* class_freepool **************************************************************
693 Frees all resources used by this classes Constant Pool.
695 *******************************************************************************/
697 static void class_freecpool(classinfo *c)
703 if (c->cptags && c->cpinfos) {
704 for (idx = 0; idx < c->cpcount; idx++) {
705 tag = c->cptags[idx];
706 info = c->cpinfos[idx];
710 case CONSTANT_Fieldref:
711 case CONSTANT_Methodref:
712 case CONSTANT_InterfaceMethodref:
713 FREE(info, constant_FMIref);
715 case CONSTANT_Integer:
716 FREE(info, constant_integer);
719 FREE(info, constant_float);
722 FREE(info, constant_long);
724 case CONSTANT_Double:
725 FREE(info, constant_double);
727 case CONSTANT_NameAndType:
728 FREE(info, constant_nameandtype);
736 MFREE(c->cptags, u1, c->cpcount);
739 MFREE(c->cpinfos, voidptr, c->cpcount);
743 /* class_getconstant ***********************************************************
745 Retrieves the value at position 'pos' of the constantpool of a
746 class. If the type of the value is other than 'ctype', an error is
749 *******************************************************************************/
751 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
753 /* check index and type of constantpool entry */
754 /* (pos == 0 is caught by type comparison) */
756 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
757 exceptions_throw_classformaterror(c, "Illegal constant pool index");
761 return c->cpinfos[pos];
765 /* innerclass_getconstant ******************************************************
767 Like class_getconstant, but if cptags is ZERO, null is returned.
769 *******************************************************************************/
771 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
773 /* invalid position in constantpool */
775 if (pos >= c->cpcount) {
776 exceptions_throw_classformaterror(c, "Illegal constant pool index");
780 /* constantpool entry of type 0 */
782 if (c->cptags[pos] == 0)
785 /* check type of constantpool entry */
787 if (c->cptags[pos] != ctype) {
788 exceptions_throw_classformaterror(c, "Illegal constant pool index");
792 return c->cpinfos[pos];
796 /* class_free ******************************************************************
798 Frees all resources used by the class.
800 *******************************************************************************/
802 void class_free(classinfo *c)
809 if (c->interfaces != NULL)
810 MFREE(c->interfaces, classinfo*, c->interfacescount);
813 for (i = 0; i < c->fieldscount; i++)
814 field_free(&(c->fields[i]));
815 #if defined(ENABLE_CACAO_GC)
816 MFREE(c->fields, fieldinfo, c->fieldscount);
821 for (i = 0; i < c->methodscount; i++)
822 method_free(&(c->methods[i]));
823 MFREE(c->methods, methodinfo, c->methodscount);
826 if ((v = c->vftbl) != NULL) {
828 mem_free(v->arraydesc,sizeof(arraydescriptor));
830 for (i = 0; i < v->interfacetablelength; i++) {
831 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
833 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
835 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
836 sizeof(methodptr*) * (v->interfacetablelength -
837 (v->interfacetablelength > 0));
838 v = (vftbl_t*) (((methodptr*) v) -
839 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
844 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
846 /* if (c->classvftbl)
847 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
853 /* get_array_class *************************************************************
855 Returns the array class with the given name for the given
856 classloader, or NULL if an exception occurred.
858 Note: This function does eager loading.
860 *******************************************************************************/
862 static classinfo *get_array_class(utf *name,classloader *initloader,
863 classloader *defloader,bool link)
867 /* lookup this class in the classcache */
868 c = classcache_lookup(initloader,name);
870 c = classcache_lookup_defined(defloader,name);
873 /* we have to create it */
874 c = class_create_classinfo(name);
875 c = load_newly_created_array(c,initloader);
881 assert(c->state & CLASS_LOADED);
882 assert(c->classloader == defloader);
884 if (link && !(c->state & CLASS_LINKED))
888 assert(!link || (c->state & CLASS_LINKED));
894 /* class_array_of **************************************************************
896 Returns an array class with the given component class. The array
897 class is dynamically created if neccessary.
899 *******************************************************************************/
901 classinfo *class_array_of(classinfo *component, bool link)
910 cl = component->classloader;
912 dumpsize = dump_size();
914 /* Assemble the array class name */
915 namelen = component->name->blength;
917 if (component->name->text[0] == '[') {
918 /* the component is itself an array */
919 namebuf = DMNEW(char, namelen + 1);
921 MCOPY(namebuf + 1, component->name->text, char, namelen);
925 /* the component is a non-array class */
926 namebuf = DMNEW(char, namelen + 3);
929 MCOPY(namebuf + 2, component->name->text, char, namelen);
930 namebuf[2 + namelen] = ';';
934 u = utf_new(namebuf, namelen);
936 c = get_array_class(u, cl, cl, link);
938 dump_release(dumpsize);
944 /* class_multiarray_of *********************************************************
946 Returns an array class with the given dimension and element class.
947 The array class is dynamically created if neccessary.
949 *******************************************************************************/
951 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
958 dumpsize = dump_size();
961 log_text("Invalid array dimension requested");
965 /* Assemble the array class name */
966 namelen = element->name->blength;
968 if (element->name->text[0] == '[') {
969 /* the element is itself an array */
970 namebuf = DMNEW(char, namelen + dim);
971 memcpy(namebuf + dim, element->name->text, namelen);
975 /* the element is a non-array class */
976 namebuf = DMNEW(char, namelen + 2 + dim);
978 memcpy(namebuf + dim + 1, element->name->text, namelen);
979 namelen += (2 + dim);
980 namebuf[namelen - 1] = ';';
982 memset(namebuf, '[', dim);
984 c = get_array_class(utf_new(namebuf, namelen),
985 element->classloader,
986 element->classloader,
989 dump_release(dumpsize);
995 /* class_lookup_classref *******************************************************
997 Looks up the constant_classref for a given classname in the classref
1001 cls..............the class containing the reference
1002 name.............the name of the class refered to
1005 a pointer to a constant_classref, or
1006 NULL if the reference was not found
1008 *******************************************************************************/
1010 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
1012 constant_classref *ref;
1013 extra_classref *xref;
1018 assert(!cls->classrefcount || cls->classrefs);
1020 /* first search the main classref table */
1021 count = cls->classrefcount;
1022 ref = cls->classrefs;
1023 for (; count; --count, ++ref)
1024 if (ref->name == name)
1027 /* next try the list of extra classrefs */
1028 for (xref = cls->extclassrefs; xref; xref = xref->next) {
1029 if (xref->classref.name == name)
1030 return &(xref->classref);
1038 /* class_get_classref **********************************************************
1040 Returns the constant_classref for a given classname.
1043 cls..............the class containing the reference
1044 name.............the name of the class refered to
1047 a pointer to a constant_classref (never NULL)
1050 The given name is not checked for validity!
1052 *******************************************************************************/
1054 constant_classref *class_get_classref(classinfo *cls, utf *name)
1056 constant_classref *ref;
1057 extra_classref *xref;
1062 ref = class_lookup_classref(cls,name);
1066 xref = NEW(extra_classref);
1067 CLASSREF_INIT(xref->classref,cls,name);
1069 xref->next = cls->extclassrefs;
1070 cls->extclassrefs = xref;
1072 return &(xref->classref);
1076 /* class_get_self_classref *****************************************************
1078 Returns the constant_classref to the class itself.
1081 cls..............the class containing the reference
1084 a pointer to a constant_classref (never NULL)
1086 *******************************************************************************/
1088 constant_classref *class_get_self_classref(classinfo *cls)
1090 /* XXX this should be done in a faster way. Maybe always make */
1091 /* the classref of index 0 a self reference. */
1092 return class_get_classref(cls,cls->name);
1095 /* class_get_classref_multiarray_of ********************************************
1097 Returns an array type reference with the given dimension and element class
1101 dim..............the requested dimension
1102 dim must be in [1;255]. This is NOT checked!
1103 ref..............the component class reference
1106 a pointer to the class reference for the array type
1109 The referer of `ref` is used as the referer for the new classref.
1111 *******************************************************************************/
1113 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1118 constant_classref *cr;
1121 assert(dim >= 1 && dim <= 255);
1123 dumpsize = dump_size();
1125 /* Assemble the array class name */
1126 namelen = ref->name->blength;
1128 if (ref->name->text[0] == '[') {
1129 /* the element is itself an array */
1130 namebuf = DMNEW(char, namelen + dim);
1131 memcpy(namebuf + dim, ref->name->text, namelen);
1135 /* the element is a non-array class */
1136 namebuf = DMNEW(char, namelen + 2 + dim);
1138 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1139 namelen += (2 + dim);
1140 namebuf[namelen - 1] = ';';
1142 memset(namebuf, '[', dim);
1144 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1146 dump_release(dumpsize);
1152 /* class_get_classref_component_of *********************************************
1154 Returns the component classref of a given array type reference
1157 ref..............the array type reference
1160 a reference to the component class, or
1161 NULL if `ref` is not an object array type reference
1164 The referer of `ref` is used as the referer for the new classref.
1166 *******************************************************************************/
1168 constant_classref *class_get_classref_component_of(constant_classref *ref)
1175 name = ref->name->text;
1179 namelen = ref->name->blength - 1;
1184 else if (*name != '[') {
1188 return class_get_classref(ref->referer, utf_new(name, namelen));
1192 /* class_findmethod ************************************************************
1194 Searches a 'classinfo' structure for a method having the given name
1195 and descriptor. If descriptor is NULL, it is ignored.
1197 *******************************************************************************/
1199 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1204 for (i = 0; i < c->methodscount; i++) {
1205 m = &(c->methods[i]);
1207 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1215 /* class_resolvemethod *********************************************************
1217 Searches a class and it's super classes for a method.
1219 Superinterfaces are *not* searched.
1221 *******************************************************************************/
1223 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1228 m = class_findmethod(c, name, desc);
1233 /* JVM Specification bug:
1235 It is important NOT to resolve special <init> and <clinit>
1236 methods to super classes or interfaces; yet, this is not
1237 explicited in the specification. Section 5.4.3.3 should be
1238 updated appropriately. */
1240 if (name == utf_init || name == utf_clinit)
1250 /* class_resolveinterfacemethod_intern *****************************************
1252 Internally used helper function. Do not use this directly.
1254 *******************************************************************************/
1256 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1257 utf *name, utf *desc)
1262 /* try to find the method in the class */
1264 m = class_findmethod(c, name, desc);
1269 /* No method found? Try the super interfaces. */
1271 for (i = 0; i < c->interfacescount; i++) {
1272 m = class_resolveinterfacemethod_intern(c->interfaces[i], name, desc);
1278 /* no method found */
1284 /* class_resolveclassmethod ****************************************************
1286 Resolves a reference from REFERER to a method with NAME and DESC in
1289 If the method cannot be resolved the return value is NULL. If
1290 EXCEPT is true *exceptionptr is set, too.
1292 *******************************************************************************/
1294 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1295 classinfo *referer, bool throwexception)
1301 /* if (c->flags & ACC_INTERFACE) { */
1302 /* if (throwexception) */
1303 /* *exceptionptr = */
1304 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1308 /* try class c and its superclasses */
1312 m = class_resolvemethod(cls, name, desc);
1317 /* Try the super interfaces. */
1319 for (i = 0; i < c->interfacescount; i++) {
1320 m = class_resolveinterfacemethod_intern(c->interfaces[i], name, desc);
1327 exceptions_throw_nosuchmethoderror(c, name, desc);
1332 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1334 exceptions_throw_abstractmethoderror();
1339 /* XXX check access rights */
1345 /* class_resolveinterfacemethod ************************************************
1347 Resolves a reference from REFERER to a method with NAME and DESC in
1350 If the method cannot be resolved the return value is NULL. If
1351 EXCEPT is true *exceptionptr is set, too.
1353 *******************************************************************************/
1355 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1356 classinfo *referer, bool throwexception)
1360 if (!(c->flags & ACC_INTERFACE)) {
1362 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1367 mi = class_resolveinterfacemethod_intern(c, name, desc);
1372 /* try class java.lang.Object */
1374 mi = class_findmethod(class_java_lang_Object, name, desc);
1380 exceptions_throw_nosuchmethoderror(c, name, desc);
1386 /* class_findfield *************************************************************
1388 Searches for field with specified name and type in a classinfo
1389 structure. If no such field is found NULL is returned.
1391 *******************************************************************************/
1393 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1397 for (i = 0; i < c->fieldscount; i++)
1398 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1399 return &(c->fields[i]);
1401 if (c->super != NULL)
1402 return class_findfield(c->super, name, desc);
1408 /* class_findfield_approx ******************************************************
1410 Searches in 'classinfo'-structure for a field with the specified
1413 *******************************************************************************/
1415 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1419 /* get field index */
1421 i = class_findfield_index_by_name(c, name);
1423 /* field was not found, return */
1428 /* return field address */
1430 return &(c->fields[i]);
1434 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1438 for (i = 0; i < c->fieldscount; i++) {
1439 /* compare field names */
1441 if ((c->fields[i].name == name))
1445 /* field was not found, raise exception */
1447 exceptions_throw_nosuchfielderror(c, name);
1453 /****************** Function: class_resolvefield_int ***************************
1455 This is an internally used helper function. Do not use this directly.
1457 Tries to resolve a field having the given name and type.
1458 If the field cannot be resolved, NULL is returned.
1460 *******************************************************************************/
1462 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1467 /* search for field in class c */
1469 for (i = 0; i < c->fieldscount; i++) {
1470 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1471 return &(c->fields[i]);
1475 /* Try super interfaces recursively. */
1477 for (i = 0; i < c->interfacescount; i++) {
1478 fi = class_resolvefield_int(c->interfaces[i], name, desc);
1484 /* Try super class. */
1486 if (c->super != NULL)
1487 return class_resolvefield_int(c->super, name, desc);
1495 /********************* Function: class_resolvefield ***************************
1497 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1499 If the field cannot be resolved the return value is NULL. If EXCEPT is
1500 true *exceptionptr is set, too.
1502 *******************************************************************************/
1504 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1505 classinfo *referer, bool throwexception)
1509 fi = class_resolvefield_int(c, name, desc);
1513 exceptions_throw_nosuchfielderror(c, name);
1518 /* XXX check access rights */
1524 /* class_issubclass ************************************************************
1526 Checks if sub is a descendant of super.
1528 *******************************************************************************/
1530 bool class_issubclass(classinfo *sub, classinfo *super)
1537 /* We reached java/lang/Object and did not find the requested
1543 /* We found the requested super class. */
1553 /* class_isanysubclass *********************************************************
1555 Checks a subclass relation between two classes. Implemented
1556 interfaces are interpreted as super classes.
1558 Return value: 1 ... sub is subclass of super
1561 *******************************************************************************/
1563 bool class_isanysubclass(classinfo *sub, classinfo *super)
1568 /* This is the trivial case. */
1573 /* Primitive classes are only subclasses of themselves. */
1575 if (class_is_primitive(sub) || class_is_primitive(super))
1578 /* Check for interfaces. */
1580 if (super->flags & ACC_INTERFACE) {
1581 result = (sub->vftbl->interfacetablelength > super->index) &&
1582 (sub->vftbl->interfacetable[-super->index] != NULL);
1585 /* java.lang.Object is the only super class of any
1588 if (sub->flags & ACC_INTERFACE)
1589 return (super == class_java_lang_Object);
1591 LOCK_MONITOR_ENTER(linker_classrenumber_lock);
1593 diffval = sub->vftbl->baseval - super->vftbl->baseval;
1594 result = diffval <= (uint32_t) super->vftbl->diffval;
1596 LOCK_MONITOR_EXIT(linker_classrenumber_lock);
1603 /* class_is_primitive **********************************************************
1605 Checks if the given class is a primitive class.
1607 *******************************************************************************/
1609 bool class_is_primitive(classinfo *c)
1611 if (c->flags & ACC_CLASS_PRIMITIVE)
1618 /* class_is_anonymousclass *****************************************************
1620 Checks if the given class is an anonymous class.
1622 *******************************************************************************/
1624 bool class_is_anonymousclass(classinfo *c)
1626 if (c->flags & ACC_CLASS_ANONYMOUS)
1633 /* class_is_array **************************************************************
1635 Checks if the given class is an array class.
1637 *******************************************************************************/
1639 bool class_is_array(classinfo *c)
1641 if (!(c->state & CLASS_LINKED))
1645 return (c->vftbl->arraydesc != NULL);
1649 /* class_is_interface **********************************************************
1651 Checks if the given class is an interface.
1653 *******************************************************************************/
1655 bool class_is_interface(classinfo *c)
1657 if (c->flags & ACC_INTERFACE)
1664 /* class_is_localclass *********************************************************
1666 Checks if the given class is a local class.
1668 *******************************************************************************/
1670 bool class_is_localclass(classinfo *c)
1672 if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
1679 /* class_is_memberclass ********************************************************
1681 Checks if the given class is a member class.
1683 *******************************************************************************/
1685 bool class_is_memberclass(classinfo *c)
1687 if (c->flags & ACC_CLASS_MEMBER)
1694 /* class_get_classloader *******************************************************
1696 Return the classloader of the given class.
1698 *******************************************************************************/
1700 classloader *class_get_classloader(classinfo *c)
1704 cl = c->classloader;
1709 #if defined(ENABLE_HANDLES)
1710 /* The classloader entry itself is the handle. */
1714 /* Get the object out of the classloader entry. */
1715 /* Cast to prevent warning (will be removed). */
1717 return (classloader *) cl->object;
1722 /* class_get_superclass ********************************************************
1724 Return the super class of the given class.
1726 *******************************************************************************/
1728 classinfo *class_get_superclass(classinfo *c)
1730 /* For interfaces we return NULL. */
1732 if (c->flags & ACC_INTERFACE)
1735 /* For java/lang/Object, primitive-type and Void classes c->super
1736 is NULL and we return NULL. */
1742 /* class_get_componenttype *****************************************************
1744 Return the component class of the given class. If the given class
1745 is not an array, return NULL.
1747 *******************************************************************************/
1749 classinfo *class_get_componenttype(classinfo *c)
1751 classinfo *component;
1752 arraydescriptor *ad;
1754 /* XXX maybe we could find a way to do this without linking. */
1755 /* This way should be safe and easy, however. */
1757 if (!(c->state & CLASS_LINKED))
1761 ad = c->vftbl->arraydesc;
1766 if (ad->arraytype == ARRAYTYPE_OBJECT)
1767 component = ad->componentvftbl->class;
1769 component = primitive_class_get_by_type(ad->arraytype);
1775 /* class_get_declaredclasses ***************************************************
1777 Return an array of declared classes of the given class.
1779 *******************************************************************************/
1781 java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly)
1783 classref_or_classinfo inner;
1784 classref_or_classinfo outer;
1786 int declaredclasscount; /* number of declared classes */
1787 int pos; /* current declared class */
1788 java_handle_objectarray_t *oa; /* array of declared classes */
1792 declaredclasscount = 0;
1794 if (!class_is_primitive(c) && !class_is_array(c)) {
1795 /* Determine number of declared classes. */
1797 for (i = 0; i < c->innerclasscount; i++) {
1798 /* Get outer-class. If the inner-class is not a member
1799 class, the outer-class is NULL. */
1801 outer = c->innerclass[i].outer_class;
1803 if (outer.any == NULL)
1806 /* Check if outer-class is a classref or a real class and
1807 get the class name from the structure. */
1809 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1811 /* Outer class is this class. */
1813 if ((outername == c->name) &&
1814 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC)))
1815 declaredclasscount++;
1819 /* Allocate Class[] and check for OOM. */
1821 oa = builtin_anewarray(declaredclasscount, class_java_lang_Class);
1826 for (i = 0, pos = 0; i < c->innerclasscount; i++) {
1827 inner = c->innerclass[i].inner_class;
1828 outer = c->innerclass[i].outer_class;
1830 /* Get outer-class. If the inner-class is not a member class,
1831 the outer-class is NULL. */
1833 if (outer.any == NULL)
1836 /* Check if outer_class is a classref or a real class and get
1837 the class name from the structure. */
1839 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1841 /* Outer class is this class. */
1843 if ((outername == c->name) &&
1844 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC))) {
1846 ic = resolve_classref_or_classinfo_eager(inner, false);
1851 if (!(ic->state & CLASS_LINKED))
1852 if (!link_class(ic))
1855 LLNI_array_direct(oa, pos++) = (java_object_t *) ic;
1863 /* class_get_declaringclass ****************************************************
1865 If the class or interface given is a member of another class,
1866 return the declaring class. For array and primitive classes return
1869 *******************************************************************************/
1871 classinfo *class_get_declaringclass(classinfo *c)
1873 classref_or_classinfo cr;
1876 /* Get declaring class. */
1878 cr = c->declaringclass;
1883 /* Resolve the class if necessary. */
1885 if (IS_CLASSREF(cr)) {
1886 /* dc = resolve_classref_eager(cr.ref); */
1887 dc = resolve_classref_or_classinfo_eager(cr, true);
1892 /* Store the resolved class in the class structure. */
1903 /* class_get_enclosingclass ****************************************************
1905 Return the enclosing class for the given class.
1907 *******************************************************************************/
1909 classinfo *class_get_enclosingclass(classinfo *c)
1911 classref_or_classinfo cr;
1914 /* Get enclosing class. */
1916 cr = c->enclosingclass;
1921 /* Resolve the class if necessary. */
1923 if (IS_CLASSREF(cr)) {
1924 /* ec = resolve_classref_eager(cr.ref); */
1925 ec = resolve_classref_or_classinfo_eager(cr, true);
1930 /* Store the resolved class in the class structure. */
1941 /* class_get_interfaces ********************************************************
1943 Return an array of interfaces of the given class.
1945 *******************************************************************************/
1947 java_handle_objectarray_t *class_get_interfaces(classinfo *c)
1950 java_handle_objectarray_t *oa;
1953 if (!(c->state & CLASS_LINKED))
1957 oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
1962 for (i = 0; i < c->interfacescount; i++) {
1963 ic = c->interfaces[i];
1965 LLNI_array_direct(oa, i) = (java_object_t *) ic;
1972 /* class_get_annotations *******************************************************
1974 Return the unparsed declared annotations in an byte array
1975 of the given class (or NULL if there aren't any).
1977 *******************************************************************************/
1979 java_handle_bytearray_t *class_get_annotations(classinfo *c)
1981 #if defined(ENABLE_ANNOTATIONS)
1982 return c->annotations;
1989 /* class_get_signature *********************************************************
1991 Return the signature of the given class. For array and primitive
1992 classes return NULL.
1994 *******************************************************************************/
1996 #if defined(ENABLE_JAVASE)
1997 utf *class_get_signature(classinfo *c)
1999 /* For array and primitive classes return NULL. */
2001 if (class_is_array(c) || class_is_primitive(c))
2004 return c->signature;
2009 /* class_printflags ************************************************************
2011 Prints flags of a class.
2013 *******************************************************************************/
2015 #if !defined(NDEBUG)
2016 void class_printflags(classinfo *c)
2023 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
2024 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
2025 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
2026 if (c->flags & ACC_STATIC) printf(" STATIC");
2027 if (c->flags & ACC_FINAL) printf(" FINAL");
2028 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
2029 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
2030 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
2031 if (c->flags & ACC_NATIVE) printf(" NATIVE");
2032 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
2033 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
2038 /* class_print *****************************************************************
2040 Prints classname plus flags.
2042 *******************************************************************************/
2044 #if !defined(NDEBUG)
2045 void class_print(classinfo *c)
2052 utf_display_printable_ascii(c->name);
2053 class_printflags(c);
2058 /* class_classref_print ********************************************************
2060 Prints classname plus referer class.
2062 *******************************************************************************/
2064 #if !defined(NDEBUG)
2065 void class_classref_print(constant_classref *cr)
2072 utf_display_printable_ascii(cr->name);
2075 class_print(cr->referer);
2083 /* class_println ***************************************************************
2085 Prints classname plus flags and new line.
2087 *******************************************************************************/
2089 #if !defined(NDEBUG)
2090 void class_println(classinfo *c)
2098 /* class_classref_println ******************************************************
2100 Prints classname plus referer class and new line.
2102 *******************************************************************************/
2104 #if !defined(NDEBUG)
2105 void class_classref_println(constant_classref *cr)
2107 class_classref_print(cr);
2113 /* class_classref_or_classinfo_print *******************************************
2115 Prints classname plus referer class.
2117 *******************************************************************************/
2119 #if !defined(NDEBUG)
2120 void class_classref_or_classinfo_print(classref_or_classinfo c)
2122 if (c.any == NULL) {
2123 printf("(classref_or_classinfo) NULL");
2127 class_classref_print(c.ref);
2134 /* class_classref_or_classinfo_println *****************************************
2136 Prints classname plus referer class and a newline.
2138 *******************************************************************************/
2140 void class_classref_or_classinfo_println(classref_or_classinfo c)
2142 class_classref_or_classinfo_print(c);
2147 /* class_showconstantpool ******************************************************
2149 Dump the constant pool of the given class to stdout.
2151 *******************************************************************************/
2153 #if !defined(NDEBUG)
2154 void class_showconstantpool (classinfo *c)
2159 printf ("---- dump of constant pool ----\n");
2161 for (i=0; i<c->cpcount; i++) {
2162 printf ("#%d: ", (int) i);
2164 e = c -> cpinfos [i];
2167 switch (c -> cptags [i]) {
2168 case CONSTANT_Class:
2169 printf ("Classreference -> ");
2170 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
2172 case CONSTANT_Fieldref:
2173 printf ("Fieldref -> ");
2174 field_fieldref_print((constant_FMIref *) e);
2176 case CONSTANT_Methodref:
2177 printf ("Methodref -> ");
2178 method_methodref_print((constant_FMIref *) e);
2180 case CONSTANT_InterfaceMethodref:
2181 printf ("InterfaceMethod -> ");
2182 method_methodref_print((constant_FMIref *) e);
2184 case CONSTANT_String:
2185 printf ("String -> ");
2186 utf_display_printable_ascii (e);
2188 case CONSTANT_Integer:
2189 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
2191 case CONSTANT_Float:
2192 printf ("Float -> %f", ((constant_float*)e) -> value);
2194 case CONSTANT_Double:
2195 printf ("Double -> %f", ((constant_double*)e) -> value);
2199 u8 v = ((constant_long*)e) -> value;
2201 printf ("Long -> %ld", (long int) v);
2203 printf ("Long -> HI: %ld, LO: %ld\n",
2204 (long int) v.high, (long int) v.low);
2208 case CONSTANT_NameAndType:
2210 constant_nameandtype *cnt = e;
2211 printf ("NameAndType: ");
2212 utf_display_printable_ascii (cnt->name);
2214 utf_display_printable_ascii (cnt->descriptor);
2218 printf ("Utf8 -> ");
2219 utf_display_printable_ascii (e);
2222 log_text("Invalid type of ConstantPool-Entry");
2230 #endif /* !defined(NDEBUG) */
2233 /* class_showmethods ***********************************************************
2235 Dump info about the fields and methods of the given class to stdout.
2237 *******************************************************************************/
2239 #if !defined(NDEBUG)
2240 void class_showmethods (classinfo *c)
2244 printf("--------- Fields and Methods ----------------\n");
2246 class_printflags(c);
2250 utf_display_printable_ascii(c->name);
2255 utf_display_printable_ascii(c->super->name);
2259 printf("Index: %d\n", c->index);
2261 printf("Interfaces:\n");
2262 for (i = 0; i < c->interfacescount; i++) {
2264 utf_display_printable_ascii(c->interfaces[i]->name);
2265 printf (" (%d)\n", c->interfaces[i]->index);
2268 printf("Fields:\n");
2269 for (i = 0; i < c->fieldscount; i++)
2270 field_println(&(c->fields[i]));
2272 printf("Methods:\n");
2273 for (i = 0; i < c->methodscount; i++) {
2274 methodinfo *m = &(c->methods[i]);
2276 if (!(m->flags & ACC_STATIC))
2277 printf("vftblindex: %d ", m->vftblindex);
2282 printf ("Virtual function table:\n");
2283 for (i = 0; i < c->vftbl->vftbllength; i++)
2284 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2286 #endif /* !defined(NDEBUG) */
2290 * These are local overrides for various environment variables in Emacs.
2291 * Please do not remove this and leave it at the end of the file, where
2292 * Emacs will automagically detect them.
2293 * ---------------------------------------------------------------------
2296 * indent-tabs-mode: t
2300 * vim:noexpandtab:sw=4:ts=4: