- created jitcache-arm-x86 branch
[cacao.git] / src / vm / resolve.c
index 3db34bb9a33b37e0a14eb81491efd8bbf8a1cc59..a98388550e533d90431e95ef0b5bd482492122a2 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/resolve.c - resolving classes/interfaces/fields/methods
 
-   Copyright (C) 1996-2005, 2006 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.
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Edwin Steiner
-
-   Changes: Christan Thalinger
-
-   $Id: resolve.c 5768 2006-10-13 12:47:03Z edwin $
-
 */
 
 
 
 #include <assert.h>
 
+#include "vm/types.h"
+
 #include "mm/memory.h"
-#include "vm/resolve.h"
+
 #include "vm/access.h"
-#include "vm/classcache.h"
-#include "vm/descriptor.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
-#include "vm/linker.h"
-#include "vm/loader.h"
-#include "vm/options.h"
-#include "vm/stringlocal.h"
+#include "vm/primitive.h"
+#include "vm/resolve.h"
+
 #include "vm/jit/jit.h"
 #include "vm/jit/verify/typeinfo.h"
 
+#include "vmcore/classcache.h"
+#include "vmcore/descriptor.h"
+#include "vmcore/linker.h"
+#include "vmcore/loader.h"
+#include "vmcore/options.h"
+
 
 /******************************************************************************/
 /* DEBUG HELPERS                                                              */
 
 /*#define RESOLVE_VERBOSE*/
 
+/* resolve_handle_pending_exception ********************************************
+
+   Convert a pending ClassNotFoundException into a
+   NoClassDefFoundError if requested.
+
+   See: hotspot/src/share/vm/classfile/systemDictionary.cpp
+   (handle_resolution_exception)
+
+   ARGUMENTS:
+       classname .... name of the class currently resolved
+       throwError ... if true throw a NoClassDefFoundError instead of
+                      a ClassNotFoundException
+
+*******************************************************************************/
+
+void resolve_handle_pending_exception(bool throwError)
+{
+       java_handle_t *e;
+
+       /* Get the current exception. */
+
+       e = exceptions_get_exception();
+
+       if (e != NULL) {
+               if (throwError == true) {
+                       /* Convert ClassNotFoundException to
+                          NoClassDefFoundError. */
+
+                       if (builtin_instanceof(e, class_java_lang_ClassNotFoundException)) {
+                               /* Clear exception, because we are calling Java code
+                                  again. */
+
+                               exceptions_clear_exception();
+
+                               /* create new error */
+
+                               exceptions_throw_noclassdeffounderror_cause(e);
+                       }
+                       else {
+                               return;
+                       }
+               }
+               else {
+                       /* An exception conversion was not requested.  Simply
+                          return. */
+
+                       return;
+               }
+       }
+}
+
+
 /******************************************************************************/
 /* CLASS RESOLUTION                                                           */
 /******************************************************************************/
@@ -104,10 +151,13 @@ bool resolve_class_from_name(classinfo *referer,
                                                         bool link,
                                                         classinfo **result)
 {
-       classinfo *cls = NULL;
-       char *utf_ptr;
-       int len;
-       
+       classinfo *cls;
+       char      *utf_ptr;
+       int        len;
+       char      *msg;
+       s4         msglen;
+       utf       *u;
+
        assert(result);
        assert(referer);
        assert(classname);
@@ -173,10 +223,12 @@ bool resolve_class_from_name(classinfo *referer,
 #endif
 
                /* load the class */
-               if (!cls) {
-                       if (!(cls = load_class_from_classloader(classname,
-                                                                                                       referer->classloader)))
-                               return false; /* exception */
+
+               if (cls == NULL) {
+                       cls = load_class_from_classloader(classname, referer->classloader);
+
+                       if (cls == NULL)
+                               return false;
                }
        }
 
@@ -189,19 +241,27 @@ bool resolve_class_from_name(classinfo *referer,
 #endif
        
        /* check access rights of referer to refered class */
+
        if (checkaccess && !access_is_accessible_class(referer,cls)) {
-               int msglen;
-               char *message;
-
-               msglen = utf_bytes(cls->name) + utf_bytes(referer->name) + 100;
-               message = MNEW(char, msglen);
-               strcpy(message, "class is not accessible (");
-               utf_cat_classname(message, cls->name);
-               strcat(message, " from ");
-               utf_cat_classname(message, referer->name);
-               strcat(message, ")");
-               *exceptionptr = new_exception_message(string_java_lang_IllegalAccessException, message);
-               MFREE(message,char,msglen);
+               msglen =
+                       utf_bytes(cls->name) +
+                       utf_bytes(referer->name) +
+                       100;
+
+               msg = MNEW(char, msglen);
+
+               strcpy(msg, "class is not accessible (");
+               utf_cat_classname(msg, cls->name);
+               strcat(msg, " from ");
+               utf_cat_classname(msg, referer->name);
+               strcat(msg, ")");
+
+               u = utf_new_char(msg);
+
+               MFREE(msg, char, msglen);
+
+               exceptions_throw_illegalaccessexception(u);
+
                return false; /* exception */
        }
 
@@ -264,7 +324,10 @@ bool resolve_classref(methodinfo *refmethod,
 /* resolve_classref_or_classinfo ***********************************************
  
    Resolve a symbolic class reference if necessary
-  
+
+   NOTE: If given, refmethod->clazz is used as the referring class.
+         Otherwise, cls.ref->referer is used.
+
    IN:
        refmethod........the method from which resolution was triggered
                         (may be NULL if not applicable)
@@ -298,6 +361,7 @@ bool resolve_classref_or_classinfo(methodinfo *refmethod,
                                                                   classinfo **result)
 {
        classinfo         *c;
+       classinfo         *referer;
        
        assert(cls.any);
        assert(mode == resolveEager || mode == resolveLazy);
@@ -314,7 +378,18 @@ bool resolve_classref_or_classinfo(methodinfo *refmethod,
        if (IS_CLASSREF(cls)) {
                /* we must resolve this reference */
 
-               if (!resolve_class_from_name(cls.ref->referer, refmethod, cls.ref->name,
+               /* determine which class to use as the referer */
+
+               /* Common cases are refmethod == NULL or both referring classes */
+               /* being the same, so the referer usually is cls.ref->referer.    */
+               /* There is one important case where it is not: When we do a      */
+               /* deferred assignability check to a formal argument of a method, */
+               /* we must use refmethod->clazz (the caller's class) to resolve   */
+               /* the type of the formal argument.                               */
+
+               referer = (refmethod) ? refmethod->clazz : cls.ref->referer;
+
+               if (!resolve_class_from_name(referer, refmethod, cls.ref->name,
                                                                         mode, checkaccess, link, &c))
                        goto return_exception;
 
@@ -349,6 +424,33 @@ bool resolve_classref_or_classinfo(methodinfo *refmethod,
 }
 
 
+/* resolve_classref_or_classinfo_eager *****************************************
+   Resolve a symbolic class reference eagerly if necessary.
+   No attempt is made to link the class.
+
+   IN:
+       cls..............class reference or classinfo
+       checkaccess......if true, access rights to the class are checked
+  
+   RETURN VALUE:
+       classinfo *......the resolved class
+       NULL.............an exception has been thrown
+   
+*******************************************************************************/
+
+classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls,
+                                                                                          bool checkaccess)
+{
+       classinfo *c;
+
+       if (!resolve_classref_or_classinfo(NULL, cls, resolveEager, checkaccess, false, &c))
+               return NULL;
+
+       return c;
+}
+
+
 /* resolve_class_from_typedesc *************************************************
  
    Return a classinfo * for the given type descriptor
@@ -397,12 +499,16 @@ bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, class
        }
        else {
                /* a primitive type */
-               cls = primitivetype_table[d->decltype].class_primitive;
+
+               cls = primitive_class_get_by_type(d->decltype);
+
                assert(cls->state & CLASS_LOADED);
+
                if (!(cls->state & CLASS_LINKED))
                        if (!link_class(cls))
                                return false; /* exception */
        }
+
        assert(cls);
        assert(cls->state & CLASS_LOADED);
        assert(!link || (cls->state & CLASS_LINKED));
@@ -459,9 +565,12 @@ static resolve_result_t resolve_subtype_check(methodinfo *refmethod,
                                                                                          resolve_mode_t mode,
                                                                                          resolve_err_t error)
 {
-       classinfo *subclass;
-       typeinfo subti;
-       typecheck_result r;
+       classinfo        *subclass;
+       typeinfo_t          subti;
+       typecheck_result  r;
+       char             *msg;
+       s4                msglen;
+       utf              *u;
 
        assert(refmethod);
        assert(subtype.any);
@@ -475,7 +584,7 @@ static resolve_result_t resolve_subtype_check(methodinfo *refmethod,
                /* the subclass could not be resolved. therefore we are sure that  */
                /* no instances of this subclass will ever exist -> skip this test */
                /* XXX this assumes that class loading has invariant results (as in JVM spec) */
-               *exceptionptr = NULL;
+               exceptions_clear_exception();
                return resolveSucceeded;
        }
        if (!subclass)
@@ -516,27 +625,38 @@ check_again:
        if (!r) {
                /* sub class relationship is false */
 
-               char *message;
-               int msglen;
-
 #if defined(RESOLVE_VERBOSE)
                printf("SUBTYPE CHECK FAILED!\n");
 #endif
 
-               msglen = utf_bytes(subclass->name) + utf_bytes(CLASSREF_OR_CLASSINFO_NAME(supertype)) + 200;
-               message = MNEW(char, msglen);
-               strcpy(message, (error == resolveIllegalAccessError) ?
-                               "illegal access to protected member ("
-                               : "subtype constraint violated (");
-               utf_cat_classname(message, subclass->name);
-               strcat(message, " is not a subclass of ");
-               utf_cat_classname(message, CLASSREF_OR_CLASSINFO_NAME(supertype));
-               strcat(message, ")");
+               msglen =
+                       utf_bytes(subclass->name) +
+                       utf_bytes(CLASSREF_OR_CLASSINFO_NAME(supertype))
+                       + 200;
+
+               msg = MNEW(char, msglen);
+
+               strcpy(msg, (error == resolveIllegalAccessError) ?
+                          "illegal access to protected member (" :
+                          "subtype constraint violated (");
+
+               utf_cat_classname(msg, subclass->name);
+               strcat(msg, " is not a subclass of ");
+               utf_cat_classname(msg, CLASSREF_OR_CLASSINFO_NAME(supertype));
+               strcat(msg, ")");
+
+               u = utf_new_char(msg);
+
                if (error == resolveIllegalAccessError)
-                       *exceptionptr = new_exception_message(string_java_lang_IllegalAccessException, message);
+                       exceptions_throw_illegalaccessexception(u);
                else
-                       *exceptionptr = exceptions_new_linkageerror(message, NULL);
-               MFREE(message, char, msglen);
+                       exceptions_throw_linkageerror(msg, NULL);
+
+               /* ATTENTION: We probably need msg for
+                  exceptions_throw_linkageerror. */
+
+               MFREE(msg, char, msglen);
+
                return resolveFailed; /* exception */
        }
 
@@ -580,7 +700,7 @@ check_again:
 
 #if defined(ENABLE_VERIFIER)
 static resolve_result_t resolve_lazy_subtype_checks(methodinfo *refmethod,
-                                                                                                       typeinfo *subtinfo,
+                                                                                                       typeinfo_t *subtinfo,
                                                                                                        classref_or_classinfo supertype,
                                                                                                        resolve_err_t error)
 {
@@ -618,7 +738,7 @@ static resolve_result_t resolve_lazy_subtype_checks(methodinfo *refmethod,
 
        if (supertype.cls == class_java_lang_Object
                || (CLASSREF_OR_CLASSINFO_NAME(supertype) == utf_java_lang_Object
-                       && refmethod->class->classloader == NULL))
+                       && refmethod->clazz->classloader == NULL))
        {
                return resolveSucceeded;
        }
@@ -926,6 +1046,32 @@ classinfo * resolve_class_eager(unresolved_class *ref)
 }
 #endif /* ENABLE_VERIFIER */
 
+/* resolve_class_eager_no_access_check *****************************************
+   Resolve an unresolved class reference eagerly. The class is also linked.
+   Access rights are _not_ checked.
+  
+   IN:
+       ref..............struct containing the reference
+   
+   RETURN VALUE:
+       classinfo * to the class, or
+          NULL if an exception has been thrown
+   
+*******************************************************************************/
+
+#ifdef ENABLE_VERIFIER
+classinfo * resolve_class_eager_no_access_check(unresolved_class *ref)
+{
+       classinfo *c;
+
+       if (!resolve_class(ref, resolveEager, false, &c))
+               return NULL;
+
+       return c;
+}
+#endif /* ENABLE_VERIFIER */
+
 /******************************************************************************/
 /* FIELD RESOLUTION                                                           */
 /******************************************************************************/
@@ -956,15 +1102,18 @@ resolve_result_t resolve_field_verifier_checks(methodinfo *refmethod,
                                                                                           constant_FMIref *fieldref,
                                                                                           classinfo *container,
                                                                                           fieldinfo *fi,
-                                                                                          typeinfo *instanceti,
-                                                                                          typeinfo *valueti,
+                                                                                          typeinfo_t *instanceti,
+                                                                                          typeinfo_t *valueti,
                                                                                           bool isstatic,
                                                                                           bool isput)
 {
-       classinfo *declarer;
-       classinfo *referer;
-       resolve_result_t result;
+       classinfo         *declarer;
+       classinfo         *referer;
+       resolve_result_t   result;
        constant_classref *fieldtyperef;
+       char              *msg;
+       s4                 msglen;
+       utf               *u;
 
        assert(refmethod);
        assert(fieldref);
@@ -973,10 +1122,10 @@ resolve_result_t resolve_field_verifier_checks(methodinfo *refmethod,
 
        /* get the classinfos and the field type */
 
-       referer = refmethod->class;
+       referer = refmethod->clazz;
        assert(referer);
 
-       declarer = fi->class;
+       declarer = fi->clazz;
        assert(declarer);
        assert(referer->state & CLASS_LINKED);
 
@@ -990,30 +1139,39 @@ resolve_result_t resolve_field_verifier_checks(methodinfo *refmethod,
 
        if (((fi->flags & ACC_STATIC) != 0) != isstatic) {
                /* a static field is accessed via an instance, or vice versa */
-               *exceptionptr =
-                       new_exception_message(string_java_lang_IncompatibleClassChangeError,
-                               (fi->flags & ACC_STATIC) ? "static field accessed via instance"
-                                                        : "instance field  accessed without instance");
+               exceptions_throw_incompatibleclasschangeerror(declarer,
+                                                                                                         (fi->flags & ACC_STATIC)
+                                                                                                         ? "static field accessed via instance"
+                                                                                                         : "instance field  accessed without instance");
+
                return resolveFailed;
        }
 
        /* check access rights */
 
        if (!access_is_accessible_member(referer,declarer,fi->flags)) {
-               int msglen;
-               char *message;
-
-               msglen = utf_bytes(declarer->name) + utf_bytes(fi->name) + utf_bytes(referer->name) + 100;
-               message = MNEW(char, msglen);
-               strcpy(message, "field is not accessible (");
-               utf_cat_classname(message, declarer->name);
-               strcat(message, ".");
-               utf_cat(message, fi->name);
-               strcat(message, " from ");
-               utf_cat_classname(message, referer->name);
-               strcat(message, ")");
-               *exceptionptr = new_exception_message(string_java_lang_IllegalAccessException, message);
-               MFREE(message,char,msglen);
+               msglen =
+                       utf_bytes(declarer->name) +
+                       utf_bytes(fi->name) +
+                       utf_bytes(referer->name) +
+                       100;
+
+               msg = MNEW(char, msglen);
+
+               strcpy(msg, "field is not accessible (");
+               utf_cat_classname(msg, declarer->name);
+               strcat(msg, ".");
+               utf_cat(msg, fi->name);
+               strcat(msg, " from ");
+               utf_cat_classname(msg, referer->name);
+               strcat(msg, ")");
+
+               u = utf_new_char(msg);
+
+               MFREE(msg, char, msglen);
+
+               exceptions_throw_illegalaccessexception(u);
+
                return resolveFailed; /* exception */
        }
 
@@ -1021,8 +1179,8 @@ resolve_result_t resolve_field_verifier_checks(methodinfo *refmethod,
        /* instance type                                                          */
 
        if (instanceti) {
-               typeinfo *insttip;
-               typeinfo tinfo;
+               typeinfo_t *insttip;
+               typeinfo_t tinfo;
 
                /* The instanceslot must contain a reference to a non-array type */
 
@@ -1049,7 +1207,7 @@ resolve_result_t resolve_field_verifier_checks(methodinfo *refmethod,
                                return resolveFailed;
                        }
 
-                       /* XXX check that class of field == refmethod->class */
+                       /* XXX check that class of field == refmethod->clazz */
                        initclass = referer; /* XXX classrefs */
                        assert(initclass->state & CLASS_LINKED);
 
@@ -1143,7 +1301,7 @@ resolve_result_t resolve_field_lazy(methodinfo *refmethod,
 
        /* the class containing the reference */
 
-       referer = refmethod->class;
+       referer = refmethod->clazz;
        assert(referer);
 
        /* check if the field itself is already resolved */
@@ -1177,7 +1335,7 @@ resolve_result_t resolve_field_lazy(methodinfo *refmethod,
                /* this error must not be reported now. (It will be reported   */
                /* if eager resolving of this field is ever tried.)           */
 
-               *exceptionptr = NULL;
+               exceptions_clear_exception();
                return resolveDeferred; /* be lazy */
        }
 
@@ -1236,13 +1394,13 @@ bool resolve_field(unresolved_field *ref,
 
        /* the class containing the reference */
 
-       referer = ref->referermethod->class;
+       referer = ref->referermethod->clazz;
        assert(referer);
 
        /* check if the field itself is already resolved */
        if (IS_FMIREF_RESOLVED(ref->fieldref)) {
                fi = ref->fieldref->p.field;
-               container = fi->class;
+               container = fi->clazz;
                goto resolved_the_field;
        }
 
@@ -1276,7 +1434,7 @@ bool resolve_field(unresolved_field *ref,
                        /* this error must not be reported now. (It will be reported   */
                        /* if eager resolving of this field is ever tried.)           */
 
-                       *exceptionptr = NULL;
+                       exceptions_clear_exception();
                        return true; /* be lazy */
                }
 
@@ -1305,7 +1463,7 @@ resolved_the_field:
                if (checkresult != resolveSucceeded)
                        return (bool) checkresult;
 
-               declarer = fi->class;
+               declarer = fi->clazz;
                assert(declarer);
                assert(declarer->state & CLASS_LOADED);
                assert(declarer->state & CLASS_LINKED);
@@ -1410,10 +1568,10 @@ methodinfo * resolve_method_invokespecial_lookup(methodinfo *refmethod,
 
        /* get referer and declarer classes */
 
-       referer = refmethod->class;
+       referer = refmethod->clazz;
        assert(referer);
 
-       declarer = mi->class;
+       declarer = mi->clazz;
        assert(declarer);
        assert(referer->state & CLASS_LINKED);
 
@@ -1435,13 +1593,15 @@ methodinfo * resolve_method_invokespecial_lookup(methodinfo *refmethod,
                /* lookup starting with the direct super class of referer      */
 
                if ((referer->flags & ACC_SUPER) != 0) {
-                       mi = class_resolvemethod(referer->super.cls,
+                       mi = class_resolvemethod(referer->super,
                                                                         mi->name,
                                                                         mi->descriptor);
 
                        if (mi == NULL) {
                                /* the spec calls for an AbstractMethodError in this case */
+
                                exceptions_throw_abstractmethoderror();
+
                                return NULL;
                        }
                }
@@ -1476,6 +1636,9 @@ resolve_result_t resolve_method_verifier_checks(methodinfo *refmethod,
 {
        classinfo *declarer;
        classinfo *referer;
+       char      *msg;
+       s4         msglen;
+       utf       *u;
 
        assert(refmethod);
        assert(methodref);
@@ -1488,43 +1651,53 @@ resolve_result_t resolve_method_verifier_checks(methodinfo *refmethod,
 
        /* get the classinfos and the method descriptor */
 
-       referer = refmethod->class;
+       referer = refmethod->clazz;
        assert(referer);
 
-       declarer = mi->class;
+       declarer = mi->clazz;
        assert(declarer);
 
        /* check static */
 
        if (((mi->flags & ACC_STATIC) != 0) != (invokestatic != false)) {
                /* a static method is accessed via an instance, or vice versa */
-               *exceptionptr =
-                       new_exception_message(string_java_lang_IncompatibleClassChangeError,
-                               (mi->flags & ACC_STATIC) ? "static method called via instance"
-                                                        : "instance method called without instance");
+               exceptions_throw_incompatibleclasschangeerror(declarer,
+                                                                                                         (mi->flags & ACC_STATIC)
+                                                                                                         ? "static method called via instance"
+                                                                                                         : "instance method called without instance");
+
                return resolveFailed;
        }
 
        /* check access rights */
 
        if (!access_is_accessible_member(referer,declarer,mi->flags)) {
-               int msglen;
-               char *message;
-
                /* XXX clean this up. this should be in exceptions.c */
-               msglen = utf_bytes(declarer->name) + utf_bytes(mi->name) +
-                       utf_bytes(mi->descriptor) + utf_bytes(referer->name) + 100;
-               message = MNEW(char, msglen);
-               strcpy(message, "method is not accessible (");
-               utf_cat_classname(message, declarer->name);
-               strcat(message, ".");
-               utf_cat(message, mi->name);
-               utf_cat(message, mi->descriptor);
-               strcat(message," from ");
-               utf_cat_classname(message, referer->name);
-               strcat(message,")");
-               *exceptionptr = new_exception_message(string_java_lang_IllegalAccessException, message);
-               MFREE(message, char, msglen);
+
+               msglen =
+                       utf_bytes(declarer->name) +
+                       utf_bytes(mi->name) +
+                       utf_bytes(mi->descriptor) +
+                       utf_bytes(referer->name) +
+                       100;
+
+               msg = MNEW(char, msglen);
+
+               strcpy(msg, "method is not accessible (");
+               utf_cat_classname(msg, declarer->name);
+               strcat(msg, ".");
+               utf_cat(msg, mi->name);
+               utf_cat(msg, mi->descriptor);
+               strcat(msg, " from ");
+               utf_cat_classname(msg, referer->name);
+               strcat(msg, ")");
+
+               u = utf_new_char(msg);
+
+               MFREE(msg, char, msglen);
+
+               exceptions_throw_illegalaccessexception(u);
+
                return resolveFailed; /* exception */
        }
 
@@ -1555,18 +1728,18 @@ resolve_result_t resolve_method_verifier_checks(methodinfo *refmethod,
 #if defined(ENABLE_VERIFIER)
 resolve_result_t resolve_method_instance_type_checks(methodinfo *refmethod,
                                                                                                         methodinfo *mi,
-                                                                                                        typeinfo *instanceti,
+                                                                                                        typeinfo_t *instanceti,
                                                                                                         bool invokespecial)
 {
-       typeinfo         tinfo;
-       typeinfo        *tip;
+       typeinfo_t         tinfo;
+       typeinfo_t        *tip;
        resolve_result_t result;
 
        if (invokespecial && TYPEINFO_IS_NEWOBJECT(*instanceti))
        {   /* XXX clean up */
                instruction *ins = (instruction *) TYPEINFO_NEWOBJECT_INSTRUCTION(*instanceti);
                classref_or_classinfo initclass = (ins) ? ins[-1].sx.val.c
-                                                                        : CLASSREF_OR_CLASSINFO(refmethod->class);
+                                                                        : CLASSREF_OR_CLASSINFO(refmethod->clazz);
                tip = &tinfo;
                if (!typeinfo_init_class(tip, initclass))
                        return false;
@@ -1577,20 +1750,20 @@ resolve_result_t resolve_method_instance_type_checks(methodinfo *refmethod,
 
        result = resolve_lazy_subtype_checks(refmethod,
                                                                                 tip,
-                                                                                CLASSREF_OR_CLASSINFO(mi->class),
+                                                                                CLASSREF_OR_CLASSINFO(mi->clazz),
                                                                                 resolveLinkageError);
        if (result != resolveSucceeded)
                return result;
 
        /* check protected access */
 
-       /* XXX use other `declarer` than mi->class? */
+       /* XXX use other `declarer` than mi->clazz? */
        if (((mi->flags & ACC_PROTECTED) != 0)
-                       && !SAME_PACKAGE(mi->class, refmethod->class))
+                       && !SAME_PACKAGE(mi->clazz, refmethod->clazz))
        {
                result = resolve_lazy_subtype_checks(refmethod,
                                tip,
-                               CLASSREF_OR_CLASSINFO(refmethod->class),
+                               CLASSREF_OR_CLASSINFO(refmethod->clazz),
                                resolveIllegalAccessError);
                if (result != resolveSucceeded)
                        return result;
@@ -1691,9 +1864,9 @@ resolve_result_t resolve_method_param_type_checks_stackbased(
                methodinfo *refmethod, 
                methodinfo *mi,
                bool invokestatic, 
-               typedescriptor *stack)
+               typedescriptor_t *stack)
 {
-       typedescriptor  *param;
+       typedescriptor_t  *param;
        resolve_result_t result;
        methoddesc      *md;
        typedesc        *paramtypes;
@@ -1772,7 +1945,7 @@ bool resolve_method_loading_constraints(classinfo *referer,
                                /* the method definition. Since container is the same as, */
                                /* or a subclass of declarer, we also constrain declarer  */
                                /* by transitivity of loading constraints.                */
-                               name = mi->class->name;
+                               name = mi->clazz->name;
                        }
                        else {
                                name = paramtypes[i].classref->name;
@@ -1781,7 +1954,7 @@ bool resolve_method_loading_constraints(classinfo *referer,
                        /* The caller (referer) and the callee (container) must agree */
                        /* on the types of the parameters.                            */
                        if (!classcache_add_constraint(referer->classloader,
-                                                                                  mi->class->classloader, name))
+                                                                                  mi->clazz->classloader, name))
                                return false; /* exception */
                }
        }
@@ -1792,7 +1965,7 @@ bool resolve_method_loading_constraints(classinfo *referer,
                /* The caller (referer) and the callee (container) must agree */
                /* on the return type.                                        */
                if (!classcache_add_constraint(referer->classloader,
-                                       mi->class->classloader,
+                                       mi->clazz->classloader,
                                        md->returntype.classref->name))
                        return false; /* exception */
        }
@@ -1840,7 +2013,7 @@ resolve_result_t resolve_method_lazy(methodinfo *refmethod,
 
        /* the class containing the reference */
 
-       referer = refmethod->class;
+       referer = refmethod->clazz;
        assert(referer);
 
        /* check if the method itself is already resolved */
@@ -1882,7 +2055,7 @@ resolve_result_t resolve_method_lazy(methodinfo *refmethod,
                /* this error must not be reported now. (It will be reported   */
                /* if eager resolving of this method is ever tried.)           */
 
-               *exceptionptr = NULL;
+               exceptions_clear_exception();
                return resolveDeferred; /* be lazy */
        }
 
@@ -1954,14 +2127,14 @@ bool resolve_method(unresolved_method *ref, resolve_mode_t mode, methodinfo **re
 
        /* the class containing the reference */
 
-       referer = ref->referermethod->class;
+       referer = ref->referermethod->clazz;
        assert(referer);
 
        /* check if the method itself is already resolved */
 
        if (IS_FMIREF_RESOLVED(ref->methodref)) {
                mi = ref->methodref->p.method;
-               container = mi->class;
+               container = mi->clazz;
                goto resolved_the_method;
        }
 
@@ -2001,7 +2174,7 @@ bool resolve_method(unresolved_method *ref, resolve_mode_t mode, methodinfo **re
                        /* this error must not be reported now. (It will be reported   */
                        /* if eager resolving of this method is ever tried.)           */
 
-                       *exceptionptr = NULL;
+                       exceptions_clear_exception();
                        return true; /* be lazy */
                }
 
@@ -2045,7 +2218,7 @@ resolved_the_method:
                if (!resolve_method_loading_constraints(referer, mi))
                        return false;
 
-               declarer = mi->class;
+               declarer = mi->clazz;
                assert(declarer);
                assert(referer->state & CLASS_LINKED);
 
@@ -2068,7 +2241,7 @@ resolved_the_method:
 
                /* check subtype constraints for TYPE_ADR parameters */
 
-               assert(mi->parseddesc->paramcount == ref->methodref->parseddesc.md->paramcount);
+               assert(mi == ref->methodref->p.method || mi->parseddesc->paramcount == ref->methodref->parseddesc.md->paramcount);
                paramtypes = mi->parseddesc->paramtypes;
 
                for (i = 0; i < mi->parseddesc->paramcount-instancecount; i++) {
@@ -2136,7 +2309,7 @@ methodinfo * resolve_method_eager(unresolved_method *ref)
 static bool unresolved_subtype_set_from_typeinfo(classinfo *referer,
                                                                                                 methodinfo *refmethod,
                                                                                                 unresolved_subtype_set *stset,
-                                                                                                typeinfo *tinfo,
+                                                                                                typeinfo_t *tinfo,
                                                                                                 utf *declaredclassname)
 {
        int count;
@@ -2240,7 +2413,7 @@ empty_set:
 #ifdef ENABLE_VERIFIER
 unresolved_class * create_unresolved_class(methodinfo *refmethod,
                                                                                   constant_classref *classref,
-                                                                                  typeinfo *valuetype)
+                                                                                  typeinfo_t *valuetype)
 {
        unresolved_class *ref;
 
@@ -2373,12 +2546,12 @@ unresolved_field * resolve_create_unresolved_field(classinfo *referer,
 bool resolve_constrain_unresolved_field(unresolved_field *ref,
                                                                                classinfo *referer, 
                                                                                methodinfo *refmethod,
-                                                                           typeinfo *instanceti,
-                                                                           typeinfo *valueti)
+                                                                           typeinfo_t *instanceti,
+                                                                           typeinfo_t *valueti)
 {
        constant_FMIref *fieldref;
        int type;
-       typeinfo tinfo;
+       typeinfo_t tinfo;
        typedesc *fd;
 
        assert(ref);
@@ -2404,7 +2577,7 @@ bool resolve_constrain_unresolved_field(unresolved_field *ref,
 
        /* record subtype constraints for the instance type, if any */
        if (instanceti) {
-               typeinfo *insttip;
+               typeinfo_t *insttip;
 
                /* The instanceslot must contain a reference to a non-array type */
                if (!TYPEINFO_IS_REFERENCE(*instanceti)) {
@@ -2433,8 +2606,8 @@ bool resolve_constrain_unresolved_field(unresolved_field *ref,
                                                "accessing field of uninitialized object");
                                return false;
                        }
-                       /* XXX check that class of field == refmethod->class */
-                       initclass = refmethod->class; /* XXX classrefs */
+                       /* XXX check that class of field == refmethod->clazz */
+                       initclass = refmethod->clazz; /* XXX classrefs */
                        assert(initclass->state & CLASS_LOADED);
                        assert(initclass->state & CLASS_LINKED);
 
@@ -2542,13 +2715,13 @@ unresolved_method * resolve_create_unresolved_method(classinfo *referer,
 #if defined(ENABLE_VERIFIER)
 bool resolve_constrain_unresolved_method_instance(unresolved_method *ref,
                                                                                                  methodinfo *refmethod,
-                                                                                                 typeinfo *instanceti,
+                                                                                                 typeinfo_t *instanceti,
                                                                                                  bool invokespecial)
 {
        constant_FMIref   *methodref;
        constant_classref *instanceref;
-       typeinfo           tinfo;
-       typeinfo          *tip;
+       typeinfo_t           tinfo;
+       typeinfo_t          *tip;
 
        assert(ref);
        methodref = ref->methodref;
@@ -2556,7 +2729,7 @@ bool resolve_constrain_unresolved_method_instance(unresolved_method *ref,
 
        /* XXX clean this up */
        instanceref = IS_FMIREF_RESOLVED(methodref)
-               ? class_get_self_classref(methodref->p.method->class)
+               ? class_get_self_classref(methodref->p.method->clazz)
                : methodref->p.classref;
 
 #ifdef RESOLVE_VERBOSE
@@ -2571,7 +2744,7 @@ bool resolve_constrain_unresolved_method_instance(unresolved_method *ref,
        {   /* XXX clean up */
                instruction *ins = (instruction *) TYPEINFO_NEWOBJECT_INSTRUCTION(*instanceti);
                classref_or_classinfo initclass = (ins) ? ins[-1].sx.val.c
-                                                                        : CLASSREF_OR_CLASSINFO(refmethod->class);
+                                                                        : CLASSREF_OR_CLASSINFO(refmethod->clazz);
                tip = &tinfo;
                if (!typeinfo_init_class(tip, initclass))
                        return false;
@@ -2580,7 +2753,7 @@ bool resolve_constrain_unresolved_method_instance(unresolved_method *ref,
                tip = instanceti;
        }
 
-       if (!unresolved_subtype_set_from_typeinfo(refmethod->class, refmethod,
+       if (!unresolved_subtype_set_from_typeinfo(refmethod->clazz, refmethod,
                                &(ref->instancetypes),tip,instanceref->name))
                return false;
 
@@ -2649,7 +2822,7 @@ bool resolve_constrain_unresolved_method_params(jitdata *jd,
                                        UNRESOLVED_SUBTYPE_SET_EMTPY(ref->paramconstraints[j]);
                        }
                        assert(ref->paramconstraints);
-                       if (!unresolved_subtype_set_from_typeinfo(refmethod->class, refmethod,
+                       if (!unresolved_subtype_set_from_typeinfo(refmethod->clazz, refmethod,
                                                ref->paramconstraints + i,&(param->typeinfo),
                                                md->paramtypes[i+instancecount].classref->name))
                                return false;
@@ -2684,10 +2857,10 @@ bool resolve_constrain_unresolved_method_params(jitdata *jd,
 bool resolve_constrain_unresolved_method_params_stackbased(
                unresolved_method *ref,
                methodinfo *refmethod,
-               typedescriptor *stack)
+               typedescriptor_t *stack)
 {
        constant_FMIref *methodref;
-       typedescriptor *param;
+       typedescriptor_t *param;
        methoddesc *md;
        int i,j;
        int type;
@@ -2724,7 +2897,7 @@ bool resolve_constrain_unresolved_method_params_stackbased(
                                        UNRESOLVED_SUBTYPE_SET_EMTPY(ref->paramconstraints[j]);
                        }
                        assert(ref->paramconstraints);
-                       if (!unresolved_subtype_set_from_typeinfo(refmethod->class, refmethod,
+                       if (!unresolved_subtype_set_from_typeinfo(refmethod->clazz, refmethod,
                                                ref->paramconstraints + i - instancecount,&(param->typeinfo),
                                                md->paramtypes[i].classref->name))
                                return false;
@@ -2907,7 +3080,7 @@ void unresolved_field_debug_dump(unresolved_field *ref,FILE *file)
        fprintf(file,"unresolved_field(%p):\n",(void *)ref);
        if (ref) {
                fprintf(file,"    referer   : ");
-               utf_fprint_printable_ascii(file,ref->referermethod->class->name); fputc('\n',file);
+               utf_fprint_printable_ascii(file,ref->referermethod->clazz->name); fputc('\n',file);
                fprintf(file,"    refmethod : ");
                utf_fprint_printable_ascii(file,ref->referermethod->name); fputc('\n',file);
                fprintf(file,"    refmethodd: ");
@@ -2945,7 +3118,7 @@ void unresolved_method_debug_dump(unresolved_method *ref,FILE *file)
        fprintf(file,"unresolved_method(%p):\n",(void *)ref);
        if (ref) {
                fprintf(file,"    referer   : ");
-               utf_fprint_printable_ascii(file,ref->referermethod->class->name); fputc('\n',file);
+               utf_fprint_printable_ascii(file,ref->referermethod->clazz->name); fputc('\n',file);
                fprintf(file,"    refmethod : ");
                utf_fprint_printable_ascii(file,ref->referermethod->name); fputc('\n',file);
                fprintf(file,"    refmethodd: ");
@@ -2975,6 +3148,7 @@ void unresolved_method_debug_dump(unresolved_method *ref,FILE *file)
 }
 #endif /* !defined(NDEBUG) */
 
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
@@ -2988,4 +3162,3 @@ void unresolved_method_debug_dump(unresolved_method *ref,FILE *file)
  * End:
  * vim:noexpandtab:sw=4:ts=4:
  */
-