Mo,

I've applied the following patches -- which are a modification of yours,
and now four tests are failing:

  FAIL: Bean.java
  FAIL: BeanBug.java
  FAIL: Reflect.java
  FAIL: ReflectInvoke.java

Could be my changes but they should be equivalent to yours..
I think the problem may be that kaffe calls classFromSig()
on types that are part of a larger string (and not necessarily
at the end of the string) such as function types.. eg:

  "(Ljava/lang/String;II)V"

Please let me know what you want me to do...

-Archie

___________________________________________________________________________
Archie Cobbs   *   Whistle Communications, Inc.  *   http://www.whistle.com

Index: classMethod.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/classMethod.c,v
retrieving revision 1.75
diff -u -r1.75 classMethod.c
--- classMethod.c       2000/01/19 11:04:31     1.75
+++ classMethod.c       2000/02/29 19:10:24
@@ -2287,6 +2287,12 @@
 
        /* Build signature for array type */
        if (CLASS_IS_PRIMITIVE (c)) {
+               /* An array of type void is not allowed */
+               if (strcmp(CLASS_CNAME(c), "void") == 0) {
+                       postExceptionMessage(einfo, JAVA_LANG(VerifyError),
+                           "invalid array of type void");
+                       return (0);
+               }
                arr_class = CLASS_ARRAY_CACHE(c);
                if (arr_class) {
                        return (arr_class);
Index: itypes.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/itypes.c,v
retrieving revision 1.17
diff -u -r1.17 itypes.c
--- itypes.c    1999/11/29 23:44:10     1.17
+++ itypes.c    2000/02/29 19:10:24
@@ -136,24 +136,59 @@
        const char* start;
        const char* end;
 
+       /* Check for primitive types */
+       switch (**strp) {
+       case 'V':
+               cl = voidClass;
+               break;
+       case 'I':
+               cl = intClass;
+               break;
+       case 'Z':
+               cl = booleanClass;
+               break;
+       case 'S':
+               cl = shortClass;
+               break;
+       case 'B':
+               cl = byteClass;
+               break;
+       case 'C':
+               cl = charClass;
+               break;
+       case 'F':
+               cl = floatClass;
+               break;
+       case 'D':
+               cl = doubleClass;
+               break;
+       case 'J':
+               cl = longClass;
+               break;
+       default:
+               cl = 0;
+               break;
+       }
+       if (cl != 0) {
+               if (*++(*strp) != '\0') {
+                       postExceptionMessage(einfo, JAVA_LANG(VerifyError),
+                           "extra garbage after primitive type in signature");
+                       return (NULL);
+               }
+               return cl;
+       }
+
+       /* Check for non-primitive and array types */
        switch (*(*strp)++) {
-       case 'V': return (voidClass);
-       case 'I': return (intClass);
-       case 'Z': return (booleanClass);
-       case 'S': return (shortClass);
-       case 'B': return (byteClass);
-       case 'C': return (charClass);
-       case 'F': return (floatClass);
-       case 'D': return (doubleClass);
-       case 'J': return (longClass);
-       case '[': return (lookupArray(classFromSig(strp, loader, einfo),
-                                     einfo));
+       case '[':
+               return lookupArray(classFromSig(strp, loader, einfo), einfo);
+
        case 'L':
                start = *strp;
-               for (end = start; *end != 0 && *end != ';'; end++)
+               for (end = start; *end != '\0' && *end != ';'; end++)
                        ;
                *strp = end;
-               if (*end != 0) {
+               if (*end != '\0') {
                        (*strp)++;
                }
                utf8 = utf8ConstNew(start, end - start);
@@ -163,10 +198,17 @@
                }
                cl = loadClass(utf8, loader, einfo);
                utf8ConstRelease(utf8);
+               if (cl != 0 && CLASS_IS_PRIMITIVE(cl)) {
+                       postExceptionMessage(einfo, JAVA_LANG(VerifyError),
+                           "primitive type folllows `L' in signature");
+                       cl = NULL;
+               }
                return(cl);
+
        default:
                /* malformed signature */
-               postException(einfo, JAVA_LANG(VerifyError));
+               postExceptionMessage(einfo, JAVA_LANG(VerifyError),
+                   "malformed signature");
                return (NULL);
        }
 }

Reply via email to