X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvmcore%2Fclass.c;h=fe5f70a6e576b0f035227bd2d04f52b39167e537;hb=802ce8af05f0d14f8555e266031e574695721dc1;hp=7e4ccdc82db418338741d336ddde5319d6300150;hpb=3aa3345ea439071b106f64617c3a758fc9ddd3fb;p=cacao.git diff --git a/src/vmcore/class.c b/src/vmcore/class.c index 7e4ccdc82..fe5f70a6e 100644 --- a/src/vmcore/class.c +++ b/src/vmcore/class.c @@ -1,9 +1,7 @@ /* src/vmcore/class.c - class related functions - Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel, - C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, - E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, - J. Wenninger, Institut f. Computersprachen - TU Wien + Copyright (C) 1996-2005, 2006, 2007, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -81,30 +79,18 @@ classinfo *class_java_lang_String; classinfo *class_java_lang_System; classinfo *class_java_lang_Thread; classinfo *class_java_lang_ThreadGroup; -classinfo *class_java_lang_VMSystem; -classinfo *class_java_lang_VMThread; -classinfo *class_java_io_Serializable; - -#if defined(WITH_CLASSPATH_SUN) -classinfo *class_sun_reflect_MagicAccessorImpl; -#endif - -/* system exception classes required in cacao */ - classinfo *class_java_lang_Throwable; -classinfo *class_java_lang_Error; -classinfo *class_java_lang_LinkageError; -classinfo *class_java_lang_NoClassDefFoundError; -classinfo *class_java_lang_OutOfMemoryError; -classinfo *class_java_lang_VirtualMachineError; +classinfo *class_java_io_Serializable; #if defined(WITH_CLASSPATH_GNU) +classinfo *class_java_lang_VMSystem; +classinfo *class_java_lang_VMThread; classinfo *class_java_lang_VMThrowable; #endif -classinfo *class_java_lang_Exception; -classinfo *class_java_lang_ClassCastException; -classinfo *class_java_lang_ClassNotFoundException; +#if defined(WITH_CLASSPATH_SUN) +classinfo *class_sun_reflect_MagicAccessorImpl; +#endif #if defined(ENABLE_JAVASE) classinfo *class_java_lang_Void; @@ -118,12 +104,6 @@ classinfo *class_java_lang_Long; classinfo *class_java_lang_Float; classinfo *class_java_lang_Double; - -/* some runtime exception */ - -classinfo *class_java_lang_NullPointerException; - - /* some classes which may be used more often */ #if defined(ENABLE_JAVASE) @@ -133,17 +113,17 @@ classinfo *class_java_lang_reflect_Field; classinfo *class_java_lang_reflect_Method; classinfo *class_java_security_PrivilegedAction; classinfo *class_java_util_Vector; +classinfo *class_java_util_HashMap; classinfo *arrayclass_java_lang_Object; -#if defined(ENABLE_ANNOTATIONS) +# if defined(ENABLE_ANNOTATIONS) classinfo *class_sun_reflect_ConstantPool; -#if defined(WITH_CLASSPATH_GNU) +# if defined(WITH_CLASSPATH_GNU) classinfo *class_sun_reflect_annotation_AnnotationParser; +# endif +# endif #endif -#endif -#endif - /* pseudo classes for the typechecker */ @@ -228,14 +208,15 @@ classinfo *class_create_classinfo(utf *classname) log_message_utf("Creating class: ", classname); #endif - /* GCNEW_UNCOLLECTABLE clears the allocated memory */ - -#if defined(ENABLE_GC_CACAO) +#if !defined(ENABLE_GC_BOEHM) c = (classinfo *) heap_alloc_uncollectable(sizeof(classinfo)); + /*c = NEW(classinfo); + MZERO(c, classinfo, 1);*/ #else c = GCNEW_UNCOLLECTABLE(classinfo, 1); - /*c=NEW(classinfo);*/ + /* GCNEW_UNCOLLECTABLE clears the allocated memory */ #endif + c->name = classname; /* Set the header.vftbl of all loaded classes to the one of @@ -309,7 +290,7 @@ void class_postset_header_vftbl(void) *******************************************************************************/ -classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data, java_handle_t *pd) +classinfo *class_define(utf *name, classloader *cl, int32_t length, uint8_t *data, java_handle_t *pd) { classinfo *c; classinfo *r; @@ -804,7 +785,7 @@ void class_free(classinfo *c) { s4 i; vftbl_t *v; - + class_freecpool(c); if (c->interfaces != NULL) @@ -813,9 +794,7 @@ void class_free(classinfo *c) if (c->fields) { for (i = 0; i < c->fieldscount; i++) field_free(&(c->fields[i])); -#if defined(ENABLE_CACAO_GC) MFREE(c->fields, fieldinfo, c->fieldscount); -#endif } if (c->methods) { @@ -906,11 +885,11 @@ classinfo *class_array_of(classinfo *component, bool link) char *namebuf; utf *u; classinfo *c; - s4 dumpsize; + int32_t dumpmarker; cl = component->classloader; - dumpsize = dump_size(); + DMARKER; /* Assemble the array class name */ namelen = component->name->blength; @@ -936,7 +915,7 @@ classinfo *class_array_of(classinfo *component, bool link) c = get_array_class(u, cl, cl, link); - dump_release(dumpsize); + DRELEASE; return c; } @@ -953,10 +932,10 @@ classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link) { s4 namelen; char *namebuf; - s4 dumpsize; classinfo *c; + int32_t dumpmarker; - dumpsize = dump_size(); + DMARKER; if (dim < 1) { log_text("Invalid array dimension requested"); @@ -987,7 +966,7 @@ classinfo *class_multiarray_of(s4 dim, classinfo *element, bool link) element->classloader, link); - dump_release(dumpsize); + DRELEASE; return c; } @@ -1115,13 +1094,13 @@ constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *r { s4 namelen; char *namebuf; - s4 dumpsize; constant_classref *cr; + int32_t dumpmarker; assert(ref); assert(dim >= 1 && dim <= 255); - dumpsize = dump_size(); + DMARKER; /* Assemble the array class name */ namelen = ref->name->blength; @@ -1144,7 +1123,7 @@ constant_classref *class_get_classref_multiarray_of(s4 dim, constant_classref *r cr = class_get_classref(ref->referer,utf_new(namebuf, namelen)); - dump_release(dumpsize); + DRELEASE; return cr; } @@ -1601,136 +1580,6 @@ bool class_isanysubclass(classinfo *sub, classinfo *super) } -/* class_is_primitive ********************************************************** - - Checks if the given class is a primitive class. - -*******************************************************************************/ - -bool class_is_primitive(classinfo *c) -{ - if (c->flags & ACC_CLASS_PRIMITIVE) - return true; - - return false; -} - - -/* class_is_anonymousclass ***************************************************** - - Checks if the given class is an anonymous class. - -*******************************************************************************/ - -bool class_is_anonymousclass(classinfo *c) -{ - if (c->flags & ACC_CLASS_ANONYMOUS) - return true; - - return false; -} - - -/* class_is_array ************************************************************** - - Checks if the given class is an array class. - -*******************************************************************************/ - -bool class_is_array(classinfo *c) -{ - if (!(c->state & CLASS_LINKED)) - if (!link_class(c)) - return false; - - return (c->vftbl->arraydesc != NULL); -} - - -/* class_is_interface ********************************************************** - - Checks if the given class is an interface. - -*******************************************************************************/ - -bool class_is_interface(classinfo *c) -{ - if (c->flags & ACC_INTERFACE) - return true; - - return false; -} - - -/* class_is_localclass ********************************************************* - - Checks if the given class is a local class. - -*******************************************************************************/ - -bool class_is_localclass(classinfo *c) -{ - if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c)) - return true; - - return false; -} - - -/* class_is_memberclass ******************************************************** - - Checks if the given class is a member class. - -*******************************************************************************/ - -bool class_is_memberclass(classinfo *c) -{ - if (c->flags & ACC_CLASS_MEMBER) - return true; - - return false; -} - - -/* class_get_classloader ******************************************************* - - Return the classloader of the given class. - -*******************************************************************************/ - -classloader *class_get_classloader(classinfo *c) -{ - classloader *cl; - - cl = c->classloader; - - if (cl == NULL) - return NULL; - - return cl; -} - - -/* class_get_superclass ******************************************************** - - Return the super class of the given class. - -*******************************************************************************/ - -classinfo *class_get_superclass(classinfo *c) -{ - /* For interfaces we return NULL. */ - - if (c->flags & ACC_INTERFACE) - return NULL; - - /* For java/lang/Object, primitive-type and Void classes c->super - is NULL and we return NULL. */ - - return c->super; -} - - /* class_get_componenttype ***************************************************** Return the component class of the given class. If the given class @@ -1930,6 +1779,50 @@ classinfo *class_get_enclosingclass(classinfo *c) } +/* class_get_enclosingmethod *************************************************** + + Return the enclosing method for the given class. + + IN: + c ... class to return the enclosing method for + + RETURN: + methodinfo of the enclosing method + +*******************************************************************************/ + +methodinfo *class_get_enclosingmethod(classinfo *c) +{ + constant_nameandtype *cn; + classinfo *ec; + methodinfo *m; + + /* get enclosing class and method */ + + ec = class_get_enclosingclass(c); + cn = c->enclosingmethod; + + /* check for enclosing class and method */ + + if (ec == NULL) + return NULL; + + if (cn == NULL) + return NULL; + + /* find method in enclosing class */ + + m = class_findmethod(ec, cn->name, cn->descriptor); + + if (m == NULL) { + exceptions_throw_internalerror("Enclosing method doesn't exist"); + return NULL; + } + + return m; +} + + /* class_get_interfaces ******************************************************** Return an array of interfaces of the given class. @@ -1989,6 +1882,57 @@ java_handle_bytearray_t *class_get_annotations(classinfo *c) } +/* class_get_modifiers ********************************************************* + + Get the modifier flags of the given class. + + IN: + c....the class of which the modifier flags should be returned + ignoreInnerClassesAttrib + RETURN VALUE: + modifier flags + +*******************************************************************************/ + +int32_t class_get_modifiers(classinfo *c, bool ignoreInnerClassesAttrib) +{ + classref_or_classinfo inner; + classref_or_classinfo outer; + utf *innername; + int i; + + if (!ignoreInnerClassesAttrib && (c->innerclasscount != 0)) { + /* search for passed class as inner class */ + + for (i = 0; i < c->innerclasscount; i++) { + inner = c->innerclass[i].inner_class; + outer = c->innerclass[i].outer_class; + + /* Check if inner is a classref or a real class and get + the name of the structure */ + + innername = IS_CLASSREF(inner) ? inner.ref->name : inner.cls->name; + + /* innerclass is this class */ + + if (innername == c->name) { + /* has the class actually an outer class? */ + + if (outer.any) + /* return flags got from the outer class file */ + return c->innerclass[i].flags & ACC_CLASS_REFLECT_MASK; + else + return c->flags & ACC_CLASS_REFLECT_MASK; + } + } + } + + /* passed class is no inner class or it was not requested */ + + return c->flags & ACC_CLASS_REFLECT_MASK; +} + + /* class_get_signature ********************************************************* Return the signature of the given class. For array and primitive @@ -2140,11 +2084,13 @@ void class_classref_or_classinfo_print(classref_or_classinfo c) *******************************************************************************/ +#if !defined(NDEBUG) void class_classref_or_classinfo_println(classref_or_classinfo c) { class_classref_or_classinfo_print(c); printf("\n"); } +#endif /* class_showconstantpool ******************************************************