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 else if (attribute_name == utf_RuntimeVisibleAnnotations) {
658 /* RuntimeVisibleAnnotations */
659 if (!annotation_load_class_attribute_runtimevisibleannotations(cb))
662 else if (attribute_name == utf_RuntimeInvisibleAnnotations) {
663 /* RuntimeInvisibleAnnotations */
664 if (!annotation_load_class_attribute_runtimeinvisibleannotations(cb))
670 /* unknown attribute */
672 if (!loader_skip_attribute_body(cb))
681 /* class_freepool **************************************************************
683 Frees all resources used by this classes Constant Pool.
685 *******************************************************************************/
687 static void class_freecpool(classinfo *c)
693 if (c->cptags && c->cpinfos) {
694 for (idx = 0; idx < c->cpcount; idx++) {
695 tag = c->cptags[idx];
696 info = c->cpinfos[idx];
700 case CONSTANT_Fieldref:
701 case CONSTANT_Methodref:
702 case CONSTANT_InterfaceMethodref:
703 FREE(info, constant_FMIref);
705 case CONSTANT_Integer:
706 FREE(info, constant_integer);
709 FREE(info, constant_float);
712 FREE(info, constant_long);
714 case CONSTANT_Double:
715 FREE(info, constant_double);
717 case CONSTANT_NameAndType:
718 FREE(info, constant_nameandtype);
726 MFREE(c->cptags, u1, c->cpcount);
729 MFREE(c->cpinfos, voidptr, c->cpcount);
733 /* class_getconstant ***********************************************************
735 Retrieves the value at position 'pos' of the constantpool of a
736 class. If the type of the value is other than 'ctype', an error is
739 *******************************************************************************/
741 voidptr class_getconstant(classinfo *c, u4 pos, u4 ctype)
743 /* check index and type of constantpool entry */
744 /* (pos == 0 is caught by type comparison) */
746 if ((pos >= c->cpcount) || (c->cptags[pos] != ctype)) {
747 exceptions_throw_classformaterror(c, "Illegal constant pool index");
751 return c->cpinfos[pos];
755 /* innerclass_getconstant ******************************************************
757 Like class_getconstant, but if cptags is ZERO, null is returned.
759 *******************************************************************************/
761 voidptr innerclass_getconstant(classinfo *c, u4 pos, u4 ctype)
763 /* invalid position in constantpool */
765 if (pos >= c->cpcount) {
766 exceptions_throw_classformaterror(c, "Illegal constant pool index");
770 /* constantpool entry of type 0 */
772 if (c->cptags[pos] == 0)
775 /* check type of constantpool entry */
777 if (c->cptags[pos] != ctype) {
778 exceptions_throw_classformaterror(c, "Illegal constant pool index");
782 return c->cpinfos[pos];
786 /* class_free ******************************************************************
788 Frees all resources used by the class.
790 *******************************************************************************/
792 void class_free(classinfo *c)
799 if (c->interfaces != NULL)
800 MFREE(c->interfaces, classinfo*, c->interfacescount);
803 for (i = 0; i < c->fieldscount; i++)
804 field_free(&(c->fields[i]));
805 #if defined(ENABLE_CACAO_GC)
806 MFREE(c->fields, fieldinfo, c->fieldscount);
811 for (i = 0; i < c->methodscount; i++)
812 method_free(&(c->methods[i]));
813 MFREE(c->methods, methodinfo, c->methodscount);
816 if ((v = c->vftbl) != NULL) {
818 mem_free(v->arraydesc,sizeof(arraydescriptor));
820 for (i = 0; i < v->interfacetablelength; i++) {
821 MFREE(v->interfacetable[-i], methodptr, v->interfacevftbllength[i]);
823 MFREE(v->interfacevftbllength, s4, v->interfacetablelength);
825 i = sizeof(vftbl_t) + sizeof(methodptr) * (v->vftbllength - 1) +
826 sizeof(methodptr*) * (v->interfacetablelength -
827 (v->interfacetablelength > 0));
828 v = (vftbl_t*) (((methodptr*) v) -
829 (v->interfacetablelength - 1) * (v->interfacetablelength > 1));
834 MFREE(c->innerclass, innerclassinfo, c->innerclasscount);
836 /* if (c->classvftbl)
837 mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1)); */
843 /* get_array_class *************************************************************
845 Returns the array class with the given name for the given
846 classloader, or NULL if an exception occurred.
848 Note: This function does eager loading.
850 *******************************************************************************/
852 static classinfo *get_array_class(utf *name,classloader *initloader,
853 classloader *defloader,bool link)
857 /* lookup this class in the classcache */
858 c = classcache_lookup(initloader,name);
860 c = classcache_lookup_defined(defloader,name);
863 /* we have to create it */
864 c = class_create_classinfo(name);
865 c = load_newly_created_array(c,initloader);
871 assert(c->state & CLASS_LOADED);
872 assert(c->classloader == defloader);
874 if (link && !(c->state & CLASS_LINKED))
878 assert(!link || (c->state & CLASS_LINKED));
884 /* class_array_of **************************************************************
886 Returns an array class with the given component class. The array
887 class is dynamically created if neccessary.
889 *******************************************************************************/
891 classinfo *class_array_of(classinfo *component, bool link)
900 cl = component->classloader;
902 dumpsize = dump_size();
904 /* Assemble the array class name */
905 namelen = component->name->blength;
907 if (component->name->text[0] == '[') {
908 /* the component is itself an array */
909 namebuf = DMNEW(char, namelen + 1);
911 MCOPY(namebuf + 1, component->name->text, char, namelen);
915 /* the component is a non-array class */
916 namebuf = DMNEW(char, namelen + 3);
919 MCOPY(namebuf + 2, component->name->text, char, namelen);
920 namebuf[2 + namelen] = ';';
924 u = utf_new(namebuf, namelen);
926 c = get_array_class(u, cl, cl, link);
928 dump_release(dumpsize);
934 /* class_multiarray_of *********************************************************
936 Returns an array class with the given dimension and element class.
937 The array class is dynamically created if neccessary.
939 *******************************************************************************/
941 classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link)
948 dumpsize = dump_size();
951 log_text("Invalid array dimension requested");
955 /* Assemble the array class name */
956 namelen = element->name->blength;
958 if (element->name->text[0] == '[') {
959 /* the element is itself an array */
960 namebuf = DMNEW(char, namelen + dim);
961 memcpy(namebuf + dim, element->name->text, namelen);
965 /* the element is a non-array class */
966 namebuf = DMNEW(char, namelen + 2 + dim);
968 memcpy(namebuf + dim + 1, element->name->text, namelen);
969 namelen += (2 + dim);
970 namebuf[namelen - 1] = ';';
972 memset(namebuf, '[', dim);
974 c = get_array_class(utf_new(namebuf, namelen),
975 element->classloader,
976 element->classloader,
979 dump_release(dumpsize);
985 /* class_lookup_classref *******************************************************
987 Looks up the constant_classref for a given classname in the classref
991 cls..............the class containing the reference
992 name.............the name of the class refered to
995 a pointer to a constant_classref, or
996 NULL if the reference was not found
998 *******************************************************************************/
1000 constant_classref *class_lookup_classref(classinfo *cls, utf *name)
1002 constant_classref *ref;
1003 extra_classref *xref;
1008 assert(!cls->classrefcount || cls->classrefs);
1010 /* first search the main classref table */
1011 count = cls->classrefcount;
1012 ref = cls->classrefs;
1013 for (; count; --count, ++ref)
1014 if (ref->name == name)
1017 /* next try the list of extra classrefs */
1018 for (xref = cls->extclassrefs; xref; xref = xref->next) {
1019 if (xref->classref.name == name)
1020 return &(xref->classref);
1028 /* class_get_classref **********************************************************
1030 Returns the constant_classref for a given classname.
1033 cls..............the class containing the reference
1034 name.............the name of the class refered to
1037 a pointer to a constant_classref (never NULL)
1040 The given name is not checked for validity!
1042 *******************************************************************************/
1044 constant_classref *class_get_classref(classinfo *cls, utf *name)
1046 constant_classref *ref;
1047 extra_classref *xref;
1052 ref = class_lookup_classref(cls,name);
1056 xref = NEW(extra_classref);
1057 CLASSREF_INIT(xref->classref,cls,name);
1059 xref->next = cls->extclassrefs;
1060 cls->extclassrefs = xref;
1062 return &(xref->classref);
1066 /* class_get_self_classref *****************************************************
1068 Returns the constant_classref to the class itself.
1071 cls..............the class containing the reference
1074 a pointer to a constant_classref (never NULL)
1076 *******************************************************************************/
1078 constant_classref *class_get_self_classref(classinfo *cls)
1080 /* XXX this should be done in a faster way. Maybe always make */
1081 /* the classref of index 0 a self reference. */
1082 return class_get_classref(cls,cls->name);
1085 /* class_get_classref_multiarray_of ********************************************
1087 Returns an array type reference with the given dimension and element class
1091 dim..............the requested dimension
1092 dim must be in [1;255]. This is NOT checked!
1093 ref..............the component class reference
1096 a pointer to the class reference for the array type
1099 The referer of `ref` is used as the referer for the new classref.
1101 *******************************************************************************/
1103 constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
1108 constant_classref *cr;
1111 assert(dim >= 1 && dim <= 255);
1113 dumpsize = dump_size();
1115 /* Assemble the array class name */
1116 namelen = ref->name->blength;
1118 if (ref->name->text[0] == '[') {
1119 /* the element is itself an array */
1120 namebuf = DMNEW(char, namelen + dim);
1121 memcpy(namebuf + dim, ref->name->text, namelen);
1125 /* the element is a non-array class */
1126 namebuf = DMNEW(char, namelen + 2 + dim);
1128 memcpy(namebuf + dim + 1, ref->name->text, namelen);
1129 namelen += (2 + dim);
1130 namebuf[namelen - 1] = ';';
1132 memset(namebuf, '[', dim);
1134 cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
1136 dump_release(dumpsize);
1142 /* class_get_classref_component_of *********************************************
1144 Returns the component classref of a given array type reference
1147 ref..............the array type reference
1150 a reference to the component class, or
1151 NULL if `ref` is not an object array type reference
1154 The referer of `ref` is used as the referer for the new classref.
1156 *******************************************************************************/
1158 constant_classref *class_get_classref_component_of(constant_classref *ref)
1165 name = ref->name->text;
1169 namelen = ref->name->blength - 1;
1174 else if (*name != '[') {
1178 return class_get_classref(ref->referer, utf_new(name, namelen));
1182 /* class_findmethod ************************************************************
1184 Searches a 'classinfo' structure for a method having the given name
1185 and descriptor. If descriptor is NULL, it is ignored.
1187 *******************************************************************************/
1189 methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc)
1194 for (i = 0; i < c->methodscount; i++) {
1195 m = &(c->methods[i]);
1197 if ((m->name == name) && ((desc == NULL) || (m->descriptor == desc)))
1205 /* class_resolvemethod *********************************************************
1207 Searches a class and it's super classes for a method.
1209 Superinterfaces are *not* searched.
1211 *******************************************************************************/
1213 methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
1218 m = class_findmethod(c, name, desc);
1223 /* JVM Specification bug:
1225 It is important NOT to resolve special <init> and <clinit>
1226 methods to super classes or interfaces; yet, this is not
1227 explicited in the specification. Section 5.4.3.3 should be
1228 updated appropriately. */
1230 if (name == utf_init || name == utf_clinit)
1240 /* class_resolveinterfacemethod_intern *****************************************
1242 Internally used helper function. Do not use this directly.
1244 *******************************************************************************/
1246 static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
1247 utf *name, utf *desc)
1252 /* try to find the method in the class */
1254 m = class_findmethod(c, name, desc);
1259 /* No method found? Try the super interfaces. */
1261 for (i = 0; i < c->interfacescount; i++) {
1262 m = class_resolveinterfacemethod_intern(c->interfaces[i], name, desc);
1268 /* no method found */
1274 /* class_resolveclassmethod ****************************************************
1276 Resolves a reference from REFERER to a method with NAME and DESC in
1279 If the method cannot be resolved the return value is NULL. If
1280 EXCEPT is true *exceptionptr is set, too.
1282 *******************************************************************************/
1284 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
1285 classinfo *referer, bool throwexception)
1291 /* if (c->flags & ACC_INTERFACE) { */
1292 /* if (throwexception) */
1293 /* *exceptionptr = */
1294 /* new_exception(string_java_lang_IncompatibleClassChangeError); */
1298 /* try class c and its superclasses */
1302 m = class_resolvemethod(cls, name, desc);
1307 /* Try the super interfaces. */
1309 for (i = 0; i < c->interfacescount; i++) {
1310 m = class_resolveinterfacemethod_intern(c->interfaces[i], name, desc);
1317 exceptions_throw_nosuchmethoderror(c, name, desc);
1322 if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
1324 exceptions_throw_abstractmethoderror();
1329 /* XXX check access rights */
1335 /* class_resolveinterfacemethod ************************************************
1337 Resolves a reference from REFERER to a method with NAME and DESC in
1340 If the method cannot be resolved the return value is NULL. If
1341 EXCEPT is true *exceptionptr is set, too.
1343 *******************************************************************************/
1345 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
1346 classinfo *referer, bool throwexception)
1350 if (!(c->flags & ACC_INTERFACE)) {
1352 exceptions_throw_incompatibleclasschangeerror(c, "Not an interface");
1357 mi = class_resolveinterfacemethod_intern(c, name, desc);
1362 /* try class java.lang.Object */
1364 mi = class_findmethod(class_java_lang_Object, name, desc);
1370 exceptions_throw_nosuchmethoderror(c, name, desc);
1376 /* class_findfield *************************************************************
1378 Searches for field with specified name and type in a classinfo
1379 structure. If no such field is found NULL is returned.
1381 *******************************************************************************/
1383 fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc)
1387 for (i = 0; i < c->fieldscount; i++)
1388 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
1389 return &(c->fields[i]);
1391 if (c->super != NULL)
1392 return class_findfield(c->super, name, desc);
1398 /* class_findfield_approx ******************************************************
1400 Searches in 'classinfo'-structure for a field with the specified
1403 *******************************************************************************/
1405 fieldinfo *class_findfield_by_name(classinfo *c, utf *name)
1409 /* get field index */
1411 i = class_findfield_index_by_name(c, name);
1413 /* field was not found, return */
1418 /* return field address */
1420 return &(c->fields[i]);
1424 s4 class_findfield_index_by_name(classinfo *c, utf *name)
1428 for (i = 0; i < c->fieldscount; i++) {
1429 /* compare field names */
1431 if ((c->fields[i].name == name))
1435 /* field was not found, raise exception */
1437 exceptions_throw_nosuchfielderror(c, name);
1443 /****************** Function: class_resolvefield_int ***************************
1445 This is an internally used helper function. Do not use this directly.
1447 Tries to resolve a field having the given name and type.
1448 If the field cannot be resolved, NULL is returned.
1450 *******************************************************************************/
1452 static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
1457 /* search for field in class c */
1459 for (i = 0; i < c->fieldscount; i++) {
1460 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc)) {
1461 return &(c->fields[i]);
1465 /* Try super interfaces recursively. */
1467 for (i = 0; i < c->interfacescount; i++) {
1468 fi = class_resolvefield_int(c->interfaces[i], name, desc);
1474 /* Try super class. */
1476 if (c->super != NULL)
1477 return class_resolvefield_int(c->super, name, desc);
1485 /********************* Function: class_resolvefield ***************************
1487 Resolves a reference from REFERER to a field with NAME and DESC in class C.
1489 If the field cannot be resolved the return value is NULL. If EXCEPT is
1490 true *exceptionptr is set, too.
1492 *******************************************************************************/
1494 fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
1495 classinfo *referer, bool throwexception)
1499 fi = class_resolvefield_int(c, name, desc);
1503 exceptions_throw_nosuchfielderror(c, name);
1508 /* XXX check access rights */
1514 /* class_issubclass ************************************************************
1516 Checks if sub is a descendant of super.
1518 *******************************************************************************/
1520 bool class_issubclass(classinfo *sub, classinfo *super)
1527 /* We reached java/lang/Object and did not find the requested
1533 /* We found the requested super class. */
1543 /* class_isanysubclass *********************************************************
1545 Checks a subclass relation between two classes. Implemented
1546 interfaces are interpreted as super classes.
1548 Return value: 1 ... sub is subclass of super
1551 *******************************************************************************/
1553 bool class_isanysubclass(classinfo *sub, classinfo *super)
1558 /* This is the trivial case. */
1563 /* Primitive classes are only subclasses of themselves. */
1565 if (class_is_primitive(sub) || class_is_primitive(super))
1568 /* Check for interfaces. */
1570 if (super->flags & ACC_INTERFACE) {
1571 result = (sub->vftbl->interfacetablelength > super->index) &&
1572 (sub->vftbl->interfacetable[-super->index] != NULL);
1575 /* java.lang.Object is the only super class of any
1578 if (sub->flags & ACC_INTERFACE)
1579 return (super == class_java_lang_Object);
1581 LOCK_MONITOR_ENTER(linker_classrenumber_lock);
1583 diffval = sub->vftbl->baseval - super->vftbl->baseval;
1584 result = diffval <= (uint32_t) super->vftbl->diffval;
1586 LOCK_MONITOR_EXIT(linker_classrenumber_lock);
1593 /* class_is_primitive **********************************************************
1595 Checks if the given class is a primitive class.
1597 *******************************************************************************/
1599 bool class_is_primitive(classinfo *c)
1601 if (c->flags & ACC_CLASS_PRIMITIVE)
1608 /* class_is_anonymousclass *****************************************************
1610 Checks if the given class is an anonymous class.
1612 *******************************************************************************/
1614 bool class_is_anonymousclass(classinfo *c)
1616 if (c->flags & ACC_CLASS_ANONYMOUS)
1623 /* class_is_array **************************************************************
1625 Checks if the given class is an array class.
1627 *******************************************************************************/
1629 bool class_is_array(classinfo *c)
1631 if (!(c->state & CLASS_LINKED))
1635 return (c->vftbl->arraydesc != NULL);
1639 /* class_is_interface **********************************************************
1641 Checks if the given class is an interface.
1643 *******************************************************************************/
1645 bool class_is_interface(classinfo *c)
1647 if (c->flags & ACC_INTERFACE)
1654 /* class_is_localclass *********************************************************
1656 Checks if the given class is a local class.
1658 *******************************************************************************/
1660 bool class_is_localclass(classinfo *c)
1662 if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
1669 /* class_is_memberclass ********************************************************
1671 Checks if the given class is a member class.
1673 *******************************************************************************/
1675 bool class_is_memberclass(classinfo *c)
1677 if (c->flags & ACC_CLASS_MEMBER)
1684 /* class_get_classloader *******************************************************
1686 Return the classloader of the given class.
1688 *******************************************************************************/
1690 classloader *class_get_classloader(classinfo *c)
1694 cl = c->classloader;
1703 /* class_get_superclass ********************************************************
1705 Return the super class of the given class.
1707 *******************************************************************************/
1709 classinfo *class_get_superclass(classinfo *c)
1711 /* For interfaces we return NULL. */
1713 if (c->flags & ACC_INTERFACE)
1716 /* For java/lang/Object, primitive-type and Void classes c->super
1717 is NULL and we return NULL. */
1723 /* class_get_componenttype *****************************************************
1725 Return the component class of the given class. If the given class
1726 is not an array, return NULL.
1728 *******************************************************************************/
1730 classinfo *class_get_componenttype(classinfo *c)
1732 classinfo *component;
1733 arraydescriptor *ad;
1735 /* XXX maybe we could find a way to do this without linking. */
1736 /* This way should be safe and easy, however. */
1738 if (!(c->state & CLASS_LINKED))
1742 ad = c->vftbl->arraydesc;
1747 if (ad->arraytype == ARRAYTYPE_OBJECT)
1748 component = ad->componentvftbl->class;
1750 component = primitive_class_get_by_type(ad->arraytype);
1756 /* class_get_declaredclasses ***************************************************
1758 Return an array of declared classes of the given class.
1760 *******************************************************************************/
1762 java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly)
1764 classref_or_classinfo inner;
1765 classref_or_classinfo outer;
1767 int declaredclasscount; /* number of declared classes */
1768 int pos; /* current declared class */
1769 java_handle_objectarray_t *oa; /* array of declared classes */
1773 declaredclasscount = 0;
1775 if (!class_is_primitive(c) && !class_is_array(c)) {
1776 /* Determine number of declared classes. */
1778 for (i = 0; i < c->innerclasscount; i++) {
1779 /* Get outer-class. If the inner-class is not a member
1780 class, the outer-class is NULL. */
1782 outer = c->innerclass[i].outer_class;
1784 if (outer.any == NULL)
1787 /* Check if outer-class is a classref or a real class and
1788 get the class name from the structure. */
1790 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1792 /* Outer class is this class. */
1794 if ((outername == c->name) &&
1795 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC)))
1796 declaredclasscount++;
1800 /* Allocate Class[] and check for OOM. */
1802 oa = builtin_anewarray(declaredclasscount, class_java_lang_Class);
1807 for (i = 0, pos = 0; i < c->innerclasscount; i++) {
1808 inner = c->innerclass[i].inner_class;
1809 outer = c->innerclass[i].outer_class;
1811 /* Get outer-class. If the inner-class is not a member class,
1812 the outer-class is NULL. */
1814 if (outer.any == NULL)
1817 /* Check if outer_class is a classref or a real class and get
1818 the class name from the structure. */
1820 outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
1822 /* Outer class is this class. */
1824 if ((outername == c->name) &&
1825 ((publicOnly == 0) || (c->innerclass[i].flags & ACC_PUBLIC))) {
1827 ic = resolve_classref_or_classinfo_eager(inner, false);
1832 if (!(ic->state & CLASS_LINKED))
1833 if (!link_class(ic))
1836 LLNI_array_direct(oa, pos++) = (java_object_t *) ic;
1844 /* class_get_declaringclass ****************************************************
1846 If the class or interface given is a member of another class,
1847 return the declaring class. For array and primitive classes return
1850 *******************************************************************************/
1852 classinfo *class_get_declaringclass(classinfo *c)
1854 classref_or_classinfo cr;
1857 /* Get declaring class. */
1859 cr = c->declaringclass;
1864 /* Resolve the class if necessary. */
1866 if (IS_CLASSREF(cr)) {
1867 /* dc = resolve_classref_eager(cr.ref); */
1868 dc = resolve_classref_or_classinfo_eager(cr, true);
1873 /* Store the resolved class in the class structure. */
1884 /* class_get_enclosingclass ****************************************************
1886 Return the enclosing class for the given class.
1888 *******************************************************************************/
1890 classinfo *class_get_enclosingclass(classinfo *c)
1892 classref_or_classinfo cr;
1895 /* Get enclosing class. */
1897 cr = c->enclosingclass;
1902 /* Resolve the class if necessary. */
1904 if (IS_CLASSREF(cr)) {
1905 /* ec = resolve_classref_eager(cr.ref); */
1906 ec = resolve_classref_or_classinfo_eager(cr, true);
1911 /* Store the resolved class in the class structure. */
1922 /* class_get_interfaces ********************************************************
1924 Return an array of interfaces of the given class.
1926 *******************************************************************************/
1928 java_handle_objectarray_t *class_get_interfaces(classinfo *c)
1931 java_handle_objectarray_t *oa;
1934 if (!(c->state & CLASS_LINKED))
1938 oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
1943 for (i = 0; i < c->interfacescount; i++) {
1944 ic = c->interfaces[i];
1946 LLNI_array_direct(oa, i) = (java_object_t *) ic;
1953 /* class_get_annotations *******************************************************
1955 Get the unparsed declared annotations in a byte array
1959 c........the class of which the annotations should be returned
1962 The unparsed declared annotations in a byte array
1963 (or NULL if there aren't any).
1965 *******************************************************************************/
1967 java_handle_bytearray_t *class_get_annotations(classinfo *c)
1969 #if defined(ENABLE_ANNOTATIONS)
1970 return c->annotations;
1977 /* class_get_signature *********************************************************
1979 Return the signature of the given class. For array and primitive
1980 classes return NULL.
1982 *******************************************************************************/
1984 #if defined(ENABLE_JAVASE)
1985 utf *class_get_signature(classinfo *c)
1987 /* For array and primitive classes return NULL. */
1989 if (class_is_array(c) || class_is_primitive(c))
1992 return c->signature;
1997 /* class_printflags ************************************************************
1999 Prints flags of a class.
2001 *******************************************************************************/
2003 #if !defined(NDEBUG)
2004 void class_printflags(classinfo *c)
2011 if (c->flags & ACC_PUBLIC) printf(" PUBLIC");
2012 if (c->flags & ACC_PRIVATE) printf(" PRIVATE");
2013 if (c->flags & ACC_PROTECTED) printf(" PROTECTED");
2014 if (c->flags & ACC_STATIC) printf(" STATIC");
2015 if (c->flags & ACC_FINAL) printf(" FINAL");
2016 if (c->flags & ACC_SYNCHRONIZED) printf(" SYNCHRONIZED");
2017 if (c->flags & ACC_VOLATILE) printf(" VOLATILE");
2018 if (c->flags & ACC_TRANSIENT) printf(" TRANSIENT");
2019 if (c->flags & ACC_NATIVE) printf(" NATIVE");
2020 if (c->flags & ACC_INTERFACE) printf(" INTERFACE");
2021 if (c->flags & ACC_ABSTRACT) printf(" ABSTRACT");
2026 /* class_print *****************************************************************
2028 Prints classname plus flags.
2030 *******************************************************************************/
2032 #if !defined(NDEBUG)
2033 void class_print(classinfo *c)
2040 utf_display_printable_ascii(c->name);
2041 class_printflags(c);
2046 /* class_classref_print ********************************************************
2048 Prints classname plus referer class.
2050 *******************************************************************************/
2052 #if !defined(NDEBUG)
2053 void class_classref_print(constant_classref *cr)
2060 utf_display_printable_ascii(cr->name);
2063 class_print(cr->referer);
2071 /* class_println ***************************************************************
2073 Prints classname plus flags and new line.
2075 *******************************************************************************/
2077 #if !defined(NDEBUG)
2078 void class_println(classinfo *c)
2086 /* class_classref_println ******************************************************
2088 Prints classname plus referer class and new line.
2090 *******************************************************************************/
2092 #if !defined(NDEBUG)
2093 void class_classref_println(constant_classref *cr)
2095 class_classref_print(cr);
2101 /* class_classref_or_classinfo_print *******************************************
2103 Prints classname plus referer class.
2105 *******************************************************************************/
2107 #if !defined(NDEBUG)
2108 void class_classref_or_classinfo_print(classref_or_classinfo c)
2110 if (c.any == NULL) {
2111 printf("(classref_or_classinfo) NULL");
2115 class_classref_print(c.ref);
2122 /* class_classref_or_classinfo_println *****************************************
2124 Prints classname plus referer class and a newline.
2126 *******************************************************************************/
2128 void class_classref_or_classinfo_println(classref_or_classinfo c)
2130 class_classref_or_classinfo_print(c);
2135 /* class_showconstantpool ******************************************************
2137 Dump the constant pool of the given class to stdout.
2139 *******************************************************************************/
2141 #if !defined(NDEBUG)
2142 void class_showconstantpool (classinfo *c)
2147 printf ("---- dump of constant pool ----\n");
2149 for (i=0; i<c->cpcount; i++) {
2150 printf ("#%d: ", (int) i);
2152 e = c -> cpinfos [i];
2155 switch (c -> cptags [i]) {
2156 case CONSTANT_Class:
2157 printf ("Classreference -> ");
2158 utf_display_printable_ascii ( ((constant_classref*)e) -> name );
2160 case CONSTANT_Fieldref:
2161 printf ("Fieldref -> ");
2162 field_fieldref_print((constant_FMIref *) e);
2164 case CONSTANT_Methodref:
2165 printf ("Methodref -> ");
2166 method_methodref_print((constant_FMIref *) e);
2168 case CONSTANT_InterfaceMethodref:
2169 printf ("InterfaceMethod -> ");
2170 method_methodref_print((constant_FMIref *) e);
2172 case CONSTANT_String:
2173 printf ("String -> ");
2174 utf_display_printable_ascii (e);
2176 case CONSTANT_Integer:
2177 printf ("Integer -> %d", (int) ( ((constant_integer*)e) -> value) );
2179 case CONSTANT_Float:
2180 printf ("Float -> %f", ((constant_float*)e) -> value);
2182 case CONSTANT_Double:
2183 printf ("Double -> %f", ((constant_double*)e) -> value);
2187 u8 v = ((constant_long*)e) -> value;
2189 printf ("Long -> %ld", (long int) v);
2191 printf ("Long -> HI: %ld, LO: %ld\n",
2192 (long int) v.high, (long int) v.low);
2196 case CONSTANT_NameAndType:
2198 constant_nameandtype *cnt = e;
2199 printf ("NameAndType: ");
2200 utf_display_printable_ascii (cnt->name);
2202 utf_display_printable_ascii (cnt->descriptor);
2206 printf ("Utf8 -> ");
2207 utf_display_printable_ascii (e);
2210 log_text("Invalid type of ConstantPool-Entry");
2218 #endif /* !defined(NDEBUG) */
2221 /* class_showmethods ***********************************************************
2223 Dump info about the fields and methods of the given class to stdout.
2225 *******************************************************************************/
2227 #if !defined(NDEBUG)
2228 void class_showmethods (classinfo *c)
2232 printf("--------- Fields and Methods ----------------\n");
2234 class_printflags(c);
2238 utf_display_printable_ascii(c->name);
2243 utf_display_printable_ascii(c->super->name);
2247 printf("Index: %d\n", c->index);
2249 printf("Interfaces:\n");
2250 for (i = 0; i < c->interfacescount; i++) {
2252 utf_display_printable_ascii(c->interfaces[i]->name);
2253 printf (" (%d)\n", c->interfaces[i]->index);
2256 printf("Fields:\n");
2257 for (i = 0; i < c->fieldscount; i++)
2258 field_println(&(c->fields[i]));
2260 printf("Methods:\n");
2261 for (i = 0; i < c->methodscount; i++) {
2262 methodinfo *m = &(c->methods[i]);
2264 if (!(m->flags & ACC_STATIC))
2265 printf("vftblindex: %d ", m->vftblindex);
2270 printf ("Virtual function table:\n");
2271 for (i = 0; i < c->vftbl->vftbllength; i++)
2272 printf ("entry: %d, %ld\n", i, (long int) (c->vftbl->table[i]));
2274 #endif /* !defined(NDEBUG) */
2278 * These are local overrides for various environment variables in Emacs.
2279 * Please do not remove this and leave it at the end of the file, where
2280 * Emacs will automagically detect them.
2281 * ---------------------------------------------------------------------
2284 * indent-tabs-mode: t
2288 * vim:noexpandtab:sw=4:ts=4: