* src/vm/jit/reg.h (varinfo): Added typeinfo member.
[cacao.git] / src / vm / jit / verify / typeinfo.c
index 429e6cdff12fad6287ce1d6e1619198d3ef68312..769f73d76e6152c3f894fa34939b0b85eb8911a3 100644 (file)
 
    Authors: Edwin Steiner
 
-   $Id: typeinfo.c 4863 2006-04-30 16:17:44Z edwin $
+   $Id: typeinfo.c 5498 2006-09-14 18:56:49Z edwin $
 
 */
 
+
+#include "config.h"
+
 #include <assert.h>
 #include <string.h>
 
 #endif
 
 /**********************************************************************/
-/* TYPEVECTOR (SET) FUNCTIONS                                         */
+/* TYPEVECTOR FUNCTIONS                                               */
 /**********************************************************************/
 
-/* typevectorset_copy **********************************************************
+#if defined(ENABLE_VERIFIER)
+
+/* typevector_copy *************************************************************
  
-   Return a copy of the given typevector set.
+   Return a copy of the given typevector.
   
    IN:
           src..............typevector set to copy, must be != NULL
-          k................k-index to set in first typevector of resulting set
           size.............number of elements per typevector
 
    RETURN VALUE:
        a pointer to the new typevector set
 
-   NOTE:
-       This function recursively invokes itself with increasing k-index to
-          copy the alternative typevectors in the given set.
-
 *******************************************************************************/
 
-typevector *
-typevectorset_copy(typevector *src,int k,int size)
+varinfo *
+typevector_copy(varinfo *src, int size)
 {
-       typevector *dst;
+       varinfo *dst;
        
        TYPEINFO_ASSERT(src);
        
        dst = DNEW_TYPEVECTOR(size);
        memcpy(dst,src,TYPEVECTOR_SIZE(size));
-       dst->k = k;
-       if (src->alt)
-               dst->alt = typevectorset_copy(src->alt,k+1,size);
+
        return dst;
 }
 
-/* typevectorset_copy_inplace **************************************************
+/* typevector_copy_inplace *****************************************************
  
-   Return a copy of the given typevector set.
+   Copy a typevector to a given destination.
 
-   The DST typevector is overwritten, but alternative vectors, if SRC has any,
-   are newly allocated.
-  
    IN:
-          src..............typevector set to copy, must be != NULL
+          src..............typevector to copy, must be != NULL
           dst..............destination to write the copy to
           size.............number of elements per typevector
 
 *******************************************************************************/
 
 void
-typevectorset_copy_inplace(typevector *src,typevector *dst,int size)
+typevector_copy_inplace(varinfo *src,varinfo *dst,int size)
 {
        memcpy(dst,src,TYPEVECTOR_SIZE(size));
-       dst->k = 0; 
-       if ((src)->alt) {
-               (dst)->alt = typevectorset_copy((src)->alt,1,size);
-       }
 }
 
-/* typevectorset_checktype *****************************************************
+/* typevector_checktype ********************************************************
  
-   Check if all typevectors contain a given type at a given index.
+   Check if the typevector contains a given type at a given index.
   
    IN:
           vec..............typevector set, must be != NULL
@@ -133,177 +124,64 @@ typevectorset_copy_inplace(typevector *src,typevector *dst,int size)
           type.............TYPE_* constant to check against
 
    RETURN VALUE:
-       true if all typevectors in the set contain TYPE at INDEX,
+       true if the typevector contains TYPE at INDEX,
           false otherwise
 
 *******************************************************************************/
 
 bool
-typevectorset_checktype(typevector *vec,int index,int type)
+typevector_checktype(varinfo *vec,int index,int type)
 {
        TYPEINFO_ASSERT(vec);
-       do {
-               if (vec->td[index].type != type)
-                       return false;
-       } while ((vec = vec->alt) != NULL);
-       return true;
+
+       return vec[index].type == type;
 }
 
-/* typevectorset_checkreference ************************************************
+/* typevector_checkreference ***************************************************
  
-   Check if all typevectors contain a reference at a given index.
+   Check if the typevector contains a reference at a given index.
   
    IN:
-          vec..............typevector set, must be != NULL
+          vec..............typevector, must be != NULL
           index............index of component to check
 
    RETURN VALUE:
-       true if all typevectors in the set contain a reference at INDEX,
+       true if the typevector contains a reference at INDEX,
           false otherwise
 
 *******************************************************************************/
 
 bool
-typevectorset_checkreference(typevector *vec,int index)
+typevector_checkreference(varinfo *vec, int index)
 {
        TYPEINFO_ASSERT(vec);
-       do {
-               if (!TYPEDESC_IS_REFERENCE(vec->td[index]))
-                       return false;
-       } while ((vec = vec->alt) != NULL);
-       return true;
+       return TYPEDESC_IS_REFERENCE(vec[index]);
 }
 
 /* typevectorset_checkretaddr **************************************************
  
-   Check if all typevectors contain a returnAddress at a given index.
+   Check if the typevectors contains a returnAddress at a given index.
   
    IN:
-          vec..............typevector set, must be != NULL
+          vec..............typevector, must be != NULL
           index............index of component to check
 
    RETURN VALUE:
-       true if all typevectors in the set contain a returnAddress at INDEX,
+       true if the typevector contains a returnAddress at INDEX,
           false otherwise
 
 *******************************************************************************/
 
 bool
-typevectorset_checkretaddr(typevector *vec,int index)
+typevector_checkretaddr(varinfo *vec,int index)
 {
        TYPEINFO_ASSERT(vec);
-       do {
-               if (!TYPEDESC_IS_RETURNADDRESS(vec->td[index]))
-                       return false;
-       } while ((vec = vec->alt) != NULL);
-       return true;
-}
-
-/* typevectorset_copymergedtype ************************************************
-   Merge the types at a given index in the typevectors of a set and
-   copy the result to a destination typeinfo.
-  
-   IN:
-       m................method for exception messages
-          vec..............typevector set, must be != NULL
-          index............index of component to merge
-
-   OUT:
-       *dst.............destination typeinfo, receives the merge result
-
-   RETURN VALUE:
-       the TYPE_* constant of the resulting type
-          TYPE_VOID if incompatible types were contained at INDEX in VEC, or
-          -1...............an exception has been thrown
-
-*******************************************************************************/
-
-int
-typevectorset_copymergedtype(methodinfo *m,typevector *vec,int index,typeinfo *dst)
-{
-       int type;
-       typedescriptor *td;
-
-       TYPEINFO_ASSERT(vec);
-       TYPEINFO_ASSERT(dst);
-
-       td = vec->td + index;
-       type = td->type;
-       TYPEINFO_COPY(td->info,*dst);
-       
-       if (vec->alt) {
-               int primitive;
-               
-               primitive = TYPEINFO_IS_PRIMITIVE(*dst) ? 1 : 0;
-               
-               while ((vec = vec->alt) != NULL) {
-                       td = vec->td + index;
-                       if (type != td->type)
-                               return TYPE_VOID;
-
-                       if (type == TYPE_ADDRESS) {
-                               if ((TYPEINFO_IS_PRIMITIVE(td->info) ? 1 : 0) != primitive)
-                                       return TYPE_VOID;
-                               /* there cannot be any merge errors now. In the worst case */
-                               /* we either get a returnAddress type or a j.l.O reference */
-                               if (typeinfo_merge(m,dst,&(td->info)) == typecheck_FAIL)
-                                       return -1;
-                       }
-               }
-       }
-       return type;
-}
-
-/* typevectorset_mergedtype ****************************************************
-   Return the merged type of the types at a given index in the typevectors 
-   of a set.
-  
-   IN:
-          m................method for exception messages
-          vec..............typevector set, must be != NULL
-          index............index of component to merge
-          temp.............pointer to a typeinfo that may be used to merge the
-                           result if necessary
-
-   OUT:
-       *result..........set to the address of a typeinfo containing the
-                           merged type.
-
-   RETURN VALUE:
-       the TYPE_* constant of the resulting type
-          TYPE_VOID if incompatible types were contained at INDEX in VEC, or
-          -1...............an exception has been thrown
-
-   NOTE:
-       This function should be more efficient than typevectorset_copymergedtype
-          assuming that most typevector sets contain exactly one typevector.
-
-*******************************************************************************/
-
-int
-typevectorset_mergedtype(methodinfo *m,typevector *vec,int index,typeinfo *temp,typeinfo **result)
-{
-       TYPEINFO_ASSERT(vec);
-       TYPEINFO_ASSERT(temp);
-       TYPEINFO_ASSERT(result);
-       
-       if (vec->alt) {
-               *result = temp;
-               return typevectorset_copymergedtype(m,vec,index,temp);
-       }
-
-       *result = &(vec->td[index].info);
-       return vec->td[index].type;
+       return TYPEDESC_IS_RETURNADDRESS(vec[index]);
 }
 
-/* typevectorset_store *********************************************************
+/* typevector_store ************************************************************
  
-   Store a type at a given index in the typevectors of a set.
-   This function stores the same type in all typevectors of the set.
-   DO NOT use it to store returnAddress types!
-   DO NOT use it to store two-word types!
+   Store a type at a given index in the typevector.
   
    IN:
           vec..............typevector set, must be != NULL
@@ -312,41 +190,27 @@ typevectorset_mergedtype(methodinfo *m,typevector *vec,int index,typeinfo *temp,
           info.............typeinfo of type to set, may be NULL, 
                            if TYPE != TYPE_ADR
 
-   NOTE:
-       If there is a two-word type stored at INDEX-1 in any typevector, it is
-          changed to TYPE_VOID (because its upper half has become invalid).
-
-          The components at INDEX+1 are _not_ touched, regardless of TYPE.
-
 *******************************************************************************/
 
 void
-typevectorset_store(typevector *vec,int index,int type,typeinfo *info)
+typevector_store(varinfo *vec,int index,int type,typeinfo *info)
 {
        TYPEINFO_ASSERT(vec);
        TYPEINFO_ASSERT((info && !TYPEINFO_IS_PRIMITIVE(*info)) || type != TYPE_ADR);
 
-       do {
-               vec->td[index].type = type;
-               if (info)
-                       TYPEINFO_COPY(*info,vec->td[index].info);
-               if (index > 0 && IS_2_WORD_TYPE(vec->td[index-1].type))
-                       vec->td[index-1].type = TYPE_VOID;
-       } while ((vec = vec->alt) != NULL);
+       vec[index].type = type;
+       if (info)
+               TYPEINFO_COPY(*info,vec[index].typeinfo);
 }
 
-/* typevectorset_store_retaddr *************************************************
+/* typevector_store_retaddr ****************************************************
  
-   Store a returnAddress type at a given index in the typevectors of a set.
-   Each possible returnAddress of the type is stored in the corresponding
-   typevector of the set.
+   Store a returnAddress type at a given index in the typevector.
   
    IN:
           vec..............typevector set, must be != NULL
           index............index of component to set
-          info.............typeinfo of the returnAddress. This typeinfo must
-                           contain a return address set with at least as many
-                                               entries as there are typevectors in VEC.
+          info.............typeinfo of the returnAddress.
 
    NOTE:
        If there is a two-word type stored at INDEX-1 in any typevector, it is
@@ -355,34 +219,27 @@ typevectorset_store(typevector *vec,int index,int type,typeinfo *info)
 *******************************************************************************/
 
 void
-typevectorset_store_retaddr(typevector *vec,int index,typeinfo *info)
+typevector_store_retaddr(varinfo *vec,int index,typeinfo *info)
 {
-       typeinfo_retaddr_set *adr;
-
        TYPEINFO_ASSERT(vec);
        TYPEINFO_ASSERT(TYPEINFO_IS_PRIMITIVE(*info));
        
-       adr = (typeinfo_retaddr_set*) TYPEINFO_RETURNADDRESS(*info);
-       do {
-               TYPEINFO_ASSERT(adr);
-
-               vec->td[index].type = TYPE_ADDRESS;
-               TYPEINFO_INIT_RETURNADDRESS(vec->td[index].info,adr->addr);
-               if (index > 0 && IS_2_WORD_TYPE(vec->td[index-1].type))
-                       vec->td[index-1].type = TYPE_VOID;
-               adr = adr->alt;
-       } while ((vec = vec->alt) != NULL);
+       vec[index].type = TYPE_ADR;
+       TYPEINFO_INIT_RETURNADDRESS(vec[index].typeinfo,
+                       TYPEINFO_RETURNADDRESS(*info));
+       if (index > 0 && IS_2_WORD_TYPE(vec[index-1].type))
+               vec[index-1].type = TYPE_VOID;
 }
 
-/* typevectorset_store_twoword *************************************************
+/* typevector_store_twoword ****************************************************
  
    Store a two-word type at a given index in the typevectors of a set.
    This function stores the same type in all typevectors of the set.
   
    IN:
-          vec..............typevector set, must be != NULL
+          vec..............typevector, must be != NULL
           index............index of component to set
-          type.............TYPE_* constant of type to set (TYPE_LONG, TYPE_DOUBLE)
+          type.............TYPE_* constant of type to set (TYPE_LNG, TYPE_DBL)
 
    NOTE:
        If there is a two-word type stored at INDEX-1 in any typevector, it is
@@ -393,20 +250,18 @@ typevectorset_store_retaddr(typevector *vec,int index,typeinfo *info)
 *******************************************************************************/
 
 void
-typevectorset_store_twoword(typevector *vec,int index,int type)
+typevector_store_twoword(varinfo *vec,int index,int type)
 {
        TYPEINFO_ASSERT(vec);
-       TYPEINFO_ASSERT(type == TYPE_LONG || type == TYPE_DOUBLE);
-
-       do {
-               vec->td[index].type = type;
-               vec->td[index+1].type = TYPE_VOID;
-               if (index > 0 && IS_2_WORD_TYPE(vec->td[index-1].type))
-                       vec->td[index-1].type = TYPE_VOID;
-       } while ((vec = vec->alt) != NULL);
+       TYPEINFO_ASSERT(type == TYPE_LNG || type == TYPE_DBL);
+
+       vec[index].type = type;
+       vec[index+1].type = TYPE_VOID;
+       if (index > 0 && IS_2_WORD_TYPE(vec[index-1].type))
+               vec[index-1].type = TYPE_VOID;
 }
 
-/* typevectorset_init_object ***************************************************
+/* typevector_init_object ******************************************************
  
    Replace all uninitialized object types in the typevector set which were 
    created by the given instruction by initialized object types.
@@ -426,21 +281,19 @@ typevectorset_store_twoword(typevector *vec,int index,int type)
 *******************************************************************************/
 
 bool
-typevectorset_init_object(typevector *set,void *ins,
-                                                 classref_or_classinfo initclass,
-                                                 int size)
+typevector_init_object(varinfo *set,void *ins,
+                                          classref_or_classinfo initclass,
+                                          int size)
 {
        int i;
 
-       for (;set; set=set->alt) {
-               for (i=0; i<size; ++i) {
-                       if (set->td[i].type == TYPE_ADR
-                               && TYPEINFO_IS_NEWOBJECT(set->td[i].info)
-                               && TYPEINFO_NEWOBJECT_INSTRUCTION(set->td[i].info) == ins)
-                       {
-                               if (!typeinfo_init_class(&(set->td[i].info),initclass))
-                                       return false;
-                       }
+       for (i=0; i<size; ++i) {
+               if (set[i].type == TYPE_ADR
+                       && TYPEINFO_IS_NEWOBJECT(set[i].typeinfo)
+                       && TYPEINFO_NEWOBJECT_INSTRUCTION(set[i].typeinfo) == ins)
+               {
+                       if (!typeinfo_init_class(&(set[i].typeinfo),initclass))
+                               return false;
                }
        }
        return true;
@@ -468,24 +321,24 @@ typevectorset_init_object(typevector *set,void *ins,
 *******************************************************************************/
 
 typecheck_result
-typevector_merge(methodinfo *m,typevector *dst,typevector *y,int size)
+typevector_merge(methodinfo *m,varinfo *dst,varinfo *y,int size)
 {
        bool changed = false;
        typecheck_result r;
        
-       typedescriptor *a = dst->td;
-       typedescriptor *b = y->td;
+       varinfo *a = dst;
+       varinfo *b = y;
        while (size--) {
                if (a->type != TYPE_VOID && a->type != b->type) {
                        a->type = TYPE_VOID;
                        changed = true;
                }
-               else if (a->type == TYPE_ADDRESS) {
-                       if (TYPEINFO_IS_PRIMITIVE(a->info)) {
+               else if (a->type == TYPE_ADR) {
+                       if (TYPEINFO_IS_PRIMITIVE(a->typeinfo)) {
                                /* 'a' is a returnAddress */
-                               if (!TYPEINFO_IS_PRIMITIVE(b->info)
-                                       || (TYPEINFO_RETURNADDRESS(a->info)
-                                               != TYPEINFO_RETURNADDRESS(b->info)))
+                               if (!TYPEINFO_IS_PRIMITIVE(b->typeinfo)
+                                       || (TYPEINFO_RETURNADDRESS(a->typeinfo)
+                                               != TYPEINFO_RETURNADDRESS(b->typeinfo)))
                                {
                                        a->type = TYPE_VOID;
                                        changed = true;
@@ -493,14 +346,14 @@ typevector_merge(methodinfo *m,typevector *dst,typevector *y,int size)
                        }
                        else {
                                /* 'a' is a reference */
-                               if (TYPEINFO_IS_PRIMITIVE(b->info)) {
+                               if (TYPEINFO_IS_PRIMITIVE(b->typeinfo)) {
                                        a->type = TYPE_VOID;
                                        changed = true;
                                }
                                else {
                                        /* two reference types are merged. There cannot be */
                                        /* a merge error. In the worst case we get j.l.O.  */
-                                       r = typeinfo_merge(m,&(a->info),&(b->info));
+                                       r = typeinfo_merge(m,&(a->typeinfo),&(b->typeinfo));
                                        if (r == typecheck_FAIL)
                                                return r;
                                        changed |= r;
@@ -513,190 +366,6 @@ typevector_merge(methodinfo *m,typevector *dst,typevector *y,int size)
        return changed;
 }
 
-/* typevector_separable_from ***************************************************
-   Check if two typevectors are separable. Two typevectors are considered
-   separable if there is an index i for which both typevectors contain a
-   returnAddress type and the return addresses of the types are different.
-   The typevectors must have the same number of components.
-  
-   IN:
-          a................the first typevector
-          b................the second typevector
-          size.............number of elements per typevector
-
-   RETURN VALUE:
-       true.............typevectors are separable
-          false............typevectors are not separable
-
-*******************************************************************************/
-
-bool 
-typevector_separable_from(typevector *a,typevector *b,int size)
-{
-       typedescriptor *tda = a->td;
-       typedescriptor *tdb = b->td;
-       for (;size--; tda++,tdb++) {
-               if (TYPEDESC_IS_RETURNADDRESS(*tda)
-                       && TYPEDESC_IS_RETURNADDRESS(*tdb)
-                       && TYPEINFO_RETURNADDRESS(tda->info)
-                          != TYPEINFO_RETURNADDRESS(tdb->info))
-                       return true;
-       }
-       return false;
-}
-
-/* typevectorset_add ***********************************************************
-   Add a typevector to a typevector set. The typevector is added at the end of
-   the set and the k-index of the typevector is set accordingly.
-  
-   IN:
-          dst..............the typevector set to modify
-          v................the typevector to add
-          size.............number of elements per typevector
-
-*******************************************************************************/
-
-void
-typevectorset_add(typevector *dst,typevector *v,int size)
-{
-       TYPEINFO_ASSERT(dst);
-       TYPEINFO_ASSERT(v);
-
-       while (dst->alt)
-               dst = dst->alt;
-       dst->alt = DNEW_TYPEVECTOR(size);
-       memcpy(dst->alt,v,TYPEVECTOR_SIZE(size));
-       dst->alt->alt = NULL;
-       dst->alt->k = dst->k + 1;
-}
-
-/* typevectorset_select ********************************************************
-   Pick the typevectors from a set which contain a given return address.
-  
-   IN:
-          set..............points to the location containing the typevector set.
-                           *set may be NULL.
-          index............index to check against the return address. All
-                           typevectors must contain a returnAddress type at
-                                               this index.
-          retaddr..........the return address to select
-
-   OUT:
-       *set.............receives the typevector set after removing the
-                           selected typevectors.
-
-   RETURN VALUE:
-       a typevector set consisting of the selected typevectors.
-
-*******************************************************************************/
-
-typevector *
-typevectorset_select(typevector **set,int index,void *retaddr)
-{
-       typevector *selected;
-
-       if (!*set) return NULL;
-       
-       if (TYPEINFO_RETURNADDRESS((*set)->td[index].info) == retaddr) {
-               selected = *set;
-               *set = selected->alt;
-               selected->alt = typevectorset_select(set,index,retaddr);
-       }
-       else {
-               selected = typevectorset_select(&((*set)->alt),index,retaddr);
-       }
-       return selected;
-}
-
-/* typevector_separable_with ***************************************************
-   Check if a typevector set would be separable after adding a given
-   typevector. A typevector set is considered separable if there is an
-   index i for which all typevectors in the set contain a returnAddress type,
-   and at least two different return addresses occurr at index i.
-   The typevectors must have the same number of components.
-  
-   IN:
-          set..............the typevector set
-          add..............the typevector
-          size.............number of elements per typevector
-
-   RETURN VALUE:
-       true.............result would be separable
-          false............result would not be separable
-
-*******************************************************************************/
-
-bool
-typevectorset_separable_with(typevector *set,typevector *add,int size)
-{
-       int i;
-       typevector *v;
-       void *addr;
-       bool separable;
-
-       TYPEINFO_ASSERT(set);
-       TYPEINFO_ASSERT(add);
-
-       for (i=0; i<size; ++i) {
-               if (!TYPEDESC_IS_RETURNADDRESS(add->td[i]))
-                       continue;
-               addr = TYPEINFO_RETURNADDRESS(add->td[i].info);
-               
-               v = set;
-               separable = false;
-               do {
-                       if (!TYPEDESC_IS_RETURNADDRESS(v->td[i]))
-                               goto next_index;
-                       if (TYPEINFO_RETURNADDRESS(v->td[i].info) != addr)
-                               separable = true;
-                       v = v->alt;
-               } while (v);
-               if (separable) return true;
-       next_index:
-               ;
-       }
-       return false;
-}
-
-/* typevectorset_collapse ******************************************************
-   Collapse a typevector set into a single typevector by merging the
-   components of the typevectors at each index.
-   
-   IN:
-          dst..............the type vector set
-          size.............number of elements per typevector
-
-   OUT:
-       *dst.............the resulting typevector set (a single typevector)
-
-   RETURN VALUE:
-       typecheck_TRUE...dst has been modified
-          typecheck_FALSE..dst has not been modified
-          typecheck_FAIL...an exception has been thrown
-
-*******************************************************************************/
-
-typecheck_result
-typevectorset_collapse(methodinfo *m,typevector *dst,int size)
-{
-       bool changed = false;
-
-       TYPEINFO_ASSERT(dst);
-       
-       while (dst->alt) {
-               if (typevector_merge(m,dst,dst->alt,size) == typecheck_FAIL)
-                       return typecheck_FAIL;
-               dst->alt = dst->alt->alt;
-               changed = true;
-       }
-       return changed;
-}
-
 /**********************************************************************/
 /* READ-ONLY FUNCTIONS                                                */
 /* The following functions don't change typeinfo data.                */
@@ -1428,7 +1097,7 @@ typeinfos_init_from_methoddesc(methoddesc *desc,u1 *typebuf,typeinfo *infobuf,
                if (!typeinfo_init_from_typedesc(desc->paramtypes + i,typebuf++,infobuf++))
                        return false;
                
-               if (twoword && (typebuf[-1] == TYPE_LONG || typebuf[-1] == TYPE_DOUBLE)) {
+               if (twoword && (typebuf[-1] == TYPE_LNG || typebuf[-1] == TYPE_DBL)) {
                        if (++args > buflen) {
                                *exceptionptr = new_internalerror("Buffer too small for method arguments.");
                                return false;
@@ -1475,15 +1144,131 @@ typedescriptor_init_from_typedesc(typedescriptor *td,
 
        td->type = desc->type;
        if (td->type == TYPE_ADR) {
-               if (!typeinfo_init_class(&(td->info),CLASSREF_OR_CLASSINFO(desc->classref)))
+               if (!typeinfo_init_class(&(td->typeinfo),CLASSREF_OR_CLASSINFO(desc->classref)))
                        return false;
        }
        else {
-               TYPEINFO_INIT_PRIMITIVE(td->info);
+               TYPEINFO_INIT_PRIMITIVE(td->typeinfo);
        }
        return true;
 }
 
+/* typeinfo_init_varinfo_from_typedesc *****************************************
+   Initialize a varinfo from a typedesc.
+   
+   IN:
+          desc.............the typedesc
+
+   OUT:
+       *var.............receives the type
+                           var must be != NULL
+
+   RETURN VALUE:
+       true.............success
+          false............an exception has been thrown
+
+*******************************************************************************/
+
+bool
+typeinfo_init_varinfo_from_typedesc(varinfo *var,
+                                                                 typedesc *desc)
+{
+       TYPEINFO_ASSERT(var);
+       TYPEINFO_ASSERT(desc);
+
+       var->type = desc->type;
+       if (var->type == TYPE_ADR) {
+               if (!typeinfo_init_class(&(var->typeinfo),CLASSREF_OR_CLASSINFO(desc->classref)))
+                       return false;
+       }
+       else {
+               TYPEINFO_INIT_PRIMITIVE(var->typeinfo);
+       }
+       return true;
+}
+
+/* typeinfo_init_varinfos_from_methoddesc **************************************
+   Initialize an array of varinfos from a methoddesc.
+   
+   IN:
+       desc.............the methoddesc
+       buflen...........number of parameters the buffer can hold
+          startindex.......the zero-based index of the first parameter to
+                           write to the array. In other words the number of
+                                               parameters to skip at the beginning of the methoddesc.
+          map..............map from parameter indices to varinfo indices
+                           (indexed like jitdata.local_map)
+
+   OUT:
+       *vars............array receiving the varinfos
+                           td[0] receives the type of the
+                                               (startindex+1)th parameter of the method
+       *returntype......receives the typedescriptor of the return type.
+                           returntype may be NULL
+
+   RETURN VALUE:
+       true.............everything ok
+          false............an exception has been thrown
+
+   NOTE:
+       If (according to BUFLEN) the buffer is to small to hold the
+          parameter types, an internal error is thrown. This must be
+          avoided by checking the number of parameters and allocating enough
+          space before calling this function.
+
+*******************************************************************************/
+
+bool
+typeinfo_init_varinfos_from_methoddesc(varinfo *vars,
+                                                                        methoddesc *desc,
+                                                                        int buflen, int startindex,
+                                                                        s4 *map,
+                                                                        typedescriptor *returntype)
+{
+       s4 i;
+    s4 index;
+       s4 type;
+       s4 slot = 0;
+
+       /* skip arguments */
+       for (i=0; i<startindex; ++i) {
+               slot++;
+               if (IS_2_WORD_TYPE(desc->paramtypes[i].type))
+                       slot++;
+       }
+
+    /* check arguments */
+    for (i=startindex; i<desc->paramcount; ++i) {
+               type = desc->paramtypes[i].type;
+               index = map[5*slot + type];
+
+               slot++;
+               if (IS_2_WORD_TYPE(type))
+                       slot++;
+
+               if (index == UNUSED)
+                       continue;
+
+               if (index >= buflen) {
+                       *exceptionptr = new_internalerror("Buffer too small for method arguments.");
+                       return false;
+               }
+
+               if (!typeinfo_init_varinfo_from_typedesc(vars + index, desc->paramtypes + i))
+                       return false;
+    }
+
+    /* check returntype */
+    if (returntype) {
+               if (!typedescriptor_init_from_typedesc(returntype,&(desc->returntype)))
+                       return false;
+       }
+
+       return true;
+}
+
 /* typedescriptors_init_from_methoddesc ****************************************
  
    Initialize an array of typedescriptors from a methoddesc.
@@ -1535,14 +1320,14 @@ typedescriptors_init_from_methoddesc(typedescriptor *td,
                        return -1;
                td++;
 
-               if (twoword && (td[-1].type == TYPE_LONG || td[-1].type == TYPE_DOUBLE)) {
+               if (twoword && (td[-1].type == TYPE_LNG || td[-1].type == TYPE_DBL)) {
                        if (++args > buflen) {
                                *exceptionptr = new_internalerror("Buffer too small for method arguments.");
                                return -1;
                        }
 
                        td->type = TYPE_VOID;
-                       TYPEINFO_INIT_PRIMITIVE(td->info);
+                       TYPEINFO_INIT_PRIMITIVE(td->typeinfo);
                        td++;
                }
     }
@@ -1701,7 +1486,7 @@ typeinfo_merge_error(methodinfo *m,char *str,typeinfo *x,typeinfo *y) {
 #endif
 
     log_text(str);
-       *exceptionptr = new_verifyerror(m,str);
+       exceptions_throw_verifyerror(m, str);
 }
 
 /* Condition: clsx != clsy. */
@@ -1972,8 +1757,8 @@ typeinfo_merge_nonarrays(typeinfo *dest,
        {
                typeinfo dbgx,dbgy;
                fprintf(stderr,"merge_nonarrays:\n");
-               fprintf(stderr,"    ");if(IS_CLASSREF(x))fprintf(stderr,"<ref>");utf_fprint(stderr,xname);fprintf(stderr,"\n");
-               fprintf(stderr,"    ");if(IS_CLASSREF(y))fprintf(stderr,"<ref>");utf_fprint(stderr,yname);fprintf(stderr,"\n");
+               fprintf(stderr,"    ");if(IS_CLASSREF(x))fprintf(stderr,"<ref>");utf_fprint_printable_ascii(stderr,xname);fprintf(stderr,"\n");
+               fprintf(stderr,"    ");if(IS_CLASSREF(y))fprintf(stderr,"<ref>");utf_fprint_printable_ascii(stderr,yname);fprintf(stderr,"\n");
                fflush(stderr);
                typeinfo_init_class(&dbgx,x);
                dbgx.merged = mergedx;
@@ -2332,7 +2117,7 @@ return_simple:
                                                return typecheck_FAIL;
                                        }
                                }
-                /* DEBUG */ /* utf_display(common->name); printf("\n"); */
+                /* DEBUG */ /* utf_display_printable_ascii(common->name); printf("\n"); */
             }
                        else {
                                common.any = y->typeclass.any;
@@ -2378,6 +2163,7 @@ return_simple:
 
     return changed;
 }
+#endif /* ENABLE_VERIFER */
 
 
 /**********************************************************************/
@@ -2417,7 +2203,7 @@ typeinfo_test_parse(typeinfo *info,char *str)
         info->merged->count = num;
 
         for (i=0; i<num; ++i) {
-            if (typebuf[i] != TYPE_ADDRESS) {
+            if (typebuf[i] != TYPE_ADR) {
                 log_text("non-reference type in mergedlist");
                                assert(0);
                        }
@@ -2617,10 +2403,10 @@ typeinfo_print_class(FILE *file,classref_or_classinfo c)
        else {
                if (IS_CLASSREF(c)) {
                        fprintf(file,"<ref>");
-                       utf_fprint(file,c.ref->name);
+                       utf_fprint_printable_ascii(file,c.ref->name);
                }
                else {
-                       utf_fprint(file,c.cls->name);
+                       utf_fprint_printable_ascii(file,c.cls->name);
                }
        }
 }
@@ -2642,7 +2428,7 @@ typeinfo_print(FILE *file,typeinfo *info,int indent)
     if (TYPEINFO_IS_PRIMITIVE(*info)) {
                bptr = (basicblock*) TYPEINFO_RETURNADDRESS(*info);
                if (bptr)
-                       fprintf(file,"%sreturnAddress (L%03d)\n",ind,bptr->debug_nr);
+                       fprintf(file,"%sreturnAddress (L%03d)\n",ind,bptr->nr);
                else
                        fprintf(file,"%sprimitive\n",ind);
         return;
@@ -2654,10 +2440,10 @@ typeinfo_print(FILE *file,typeinfo *info,int indent)
     }
 
     if (TYPEINFO_IS_NEWOBJECT(*info)) {
-        ins = (instruction *)TYPEINFO_NEWOBJECT_INSTRUCTION(*info);
+        ins = (instruction *) TYPEINFO_NEWOBJECT_INSTRUCTION(*info);
         if (ins) {
             fprintf(file,"%sNEW(%p):",ind,(void*)ins);
-                       typeinfo_print_class(file,ICMD_ACONST_CLASSREF_OR_CLASSINFO(ins-1));
+                       typeinfo_print_class(file,ins[-1].sx.val.c);
             fprintf(file,"\n");
         }
         else {
@@ -2720,7 +2506,7 @@ typeinfo_print_short(FILE *file,typeinfo *info)
     if (TYPEINFO_IS_PRIMITIVE(*info)) {
                bptr = (basicblock*) TYPEINFO_RETURNADDRESS(*info);
                if (bptr)
-                       fprintf(file,"ret(L%03d)",bptr->debug_nr);
+                       fprintf(file,"ret(L%03d)",bptr->nr);
                else
                        fprintf(file,"primitive");
         return;
@@ -2732,11 +2518,11 @@ typeinfo_print_short(FILE *file,typeinfo *info)
     }
     
     if (TYPEINFO_IS_NEWOBJECT(*info)) {
-        ins = (instruction *)TYPEINFO_NEWOBJECT_INSTRUCTION(*info);
+        ins = (instruction *) TYPEINFO_NEWOBJECT_INSTRUCTION(*info);
         if (ins) {
                        /*fprintf(file,"<ins %p>",ins);*/
             fprintf(file,"NEW(%p):",(void*)ins);
-                       typeinfo_print_class(file,ICMD_ACONST_CLASSREF_OR_CLASSINFO(ins-1));
+                       typeinfo_print_class(file,ins[-1].sx.val.c);
         }
         else
             fprintf(file,"NEW(this)");
@@ -2759,12 +2545,12 @@ void
 typeinfo_print_type(FILE *file,int type,typeinfo *info)
 {
     switch (type) {
-      case TYPE_VOID:   fprintf(file,"V"); break;
-      case TYPE_INT:    fprintf(file,"I"); break;
-      case TYPE_FLOAT:  fprintf(file,"F"); break;
-      case TYPE_DOUBLE: fprintf(file,"D"); break;
-      case TYPE_LONG:   fprintf(file,"J"); break;
-      case TYPE_ADDRESS:
+      case TYPE_VOID: fprintf(file,"V"); break;
+      case TYPE_INT:  fprintf(file,"I"); break;
+      case TYPE_FLT:  fprintf(file,"F"); break;
+      case TYPE_DBL:  fprintf(file,"D"); break;
+      case TYPE_LNG:  fprintf(file,"J"); break;
+      case TYPE_ADR:
                  typeinfo_print_short(file,info);
           break;
           
@@ -2773,72 +2559,20 @@ typeinfo_print_type(FILE *file,int type,typeinfo *info)
     }
 }
 
-void
-typeinfo_print_stacktype(FILE *file,int type,typeinfo *info)
-{
-       TYPEINFO_ASSERT(file);
-       TYPEINFO_ASSERT(type != TYPE_ADDRESS || info != NULL);
-       if (type == TYPE_ADDRESS && TYPEINFO_IS_PRIMITIVE(*info)) {     
-               typeinfo_retaddr_set *set = (typeinfo_retaddr_set*)
-                       TYPEINFO_RETURNADDRESS(*info);
-               if (set) {
-                       fprintf(file,"ret(L%03d",((basicblock*)(set->addr))->debug_nr);
-                       set = set->alt;
-                       while (set) {
-                               fprintf(file,"|L%03d",((basicblock*)(set->addr))->debug_nr);
-                               set = set->alt;
-                       }
-               }
-               else {
-                       fprintf(file,"ret(<NULL>");
-               }
-               fprintf(file,")");
-       }
-       else
-               typeinfo_print_type(file,type,info);
-}
-
 void
 typedescriptor_print(FILE *file,typedescriptor *td)
 {
-       typeinfo_print_type(file,td->type,&(td->info));
-}
-
-void
-typevector_print(FILE *file,typevector *vec,int size)
-{
-    int i;
-
-       fprintf(file,"[%d]",vec->k);
-    for (i=0; i<size; ++i) {
-               fprintf(file," %d=",i);
-        typedescriptor_print(file,vec->td + i);
-    }
+       typeinfo_print_type(file,td->type,&(td->typeinfo));
 }
 
 void
-typevectorset_print(FILE *file,typevector *set,int size)
+typevector_print(FILE *file,varinfo *vec,int size)
 {
     int i;
-       typevector *vec;
 
-       fprintf(file,"[%d",set->k);
-       vec = set->alt;
-       while (vec) {
-               fprintf(file,"|%d",vec->k);
-               vec = vec->alt;
-       }
-       fprintf(file,"]");
-       
     for (i=0; i<size; ++i) {
                fprintf(file," %d=",i);
-        typedescriptor_print(file,set->td + i);
-               vec = set->alt;
-               while (vec) {
-                       fprintf(file,"|");
-                       typedescriptor_print(file,vec->td + i);
-                       vec = vec->alt;
-               }
+        typeinfo_print_type(file, vec[i].type, &(vec[i].typeinfo));
     }
 }