/* 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.
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;
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
*******************************************************************************/
-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;
{
s4 i;
vftbl_t *v;
-
+
class_freecpool(c);
if (c->interfaces != NULL)
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) {
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;
c = get_array_class(u, cl, cl, link);
- dump_release(dumpsize);
+ DRELEASE;
return c;
}
{
s4 namelen;
char *namebuf;
- s4 dumpsize;
classinfo *c;
+ int32_t dumpmarker;
- dumpsize = dump_size();
+ DMARKER;
if (dim < 1) {
log_text("Invalid array dimension requested");
element->classloader,
link);
- dump_release(dumpsize);
+ DRELEASE;
return c;
}
{
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;
cr = class_get_classref(ref->referer,utf_new(namebuf, namelen));
- dump_release(dumpsize);
+ DRELEASE;
return cr;
}
}
+/* 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.