PatchSet 7032 Date: 2005/12/22 17:51:17 Author: guilhem Branch: HEAD Tag: (none) Log: More (and hopefully final) fixes for access.
* kaffe/kaffevm/access.c (checkAccess): Simplified to the maximum according to Sun's VM spec we must not check for specific inner classes flags. * kaffe/kaffevm/classMethod.c (addInnerClasses): Do not merge inner class access flags with the class flags. * libraries/clib/native/Class.c (java_lang_VMClass_getModifiers): Return the right access flags depending on what we are asked and whether the class is nested. * test/regression/TestSerialFields.java, test/regression/TestSerialVersions.java: Removed private modifier to be able to run the tests (as for JDK). Members: ChangeLog:1.4551->1.4552 kaffe/kaffevm/access.c:1.15->1.16 kaffe/kaffevm/classMethod.c:1.149->1.150 libraries/clib/native/Class.c:1.86->1.87 test/regression/TestSerialFields.java:1.3->1.4 test/regression/TestSerialVersions.java:1.3->1.4 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.4551 kaffe/ChangeLog:1.4552 --- kaffe/ChangeLog:1.4551 Thu Dec 22 13:55:16 2005 +++ kaffe/ChangeLog Thu Dec 22 17:51:17 2005 @@ -1,3 +1,21 @@ +2005-12-22 Guilhem Lavaux <[EMAIL PROTECTED]> + + * kaffe/kaffevm/access.c + (checkAccess): Simplified to the maximum according to Sun's VM + spec we must not check for specific inner classes flags. + + * kaffe/kaffevm/classMethod.c + (addInnerClasses): Do not merge inner class access flags with the + class flags. + + * libraries/clib/native/Class.c + (java_lang_VMClass_getModifiers): Return the right access flags + depending on what we are asked and whether the class is nested. + + * test/regression/TestSerialFields.java, + test/regression/TestSerialVersions.java: Removed private modifier + to be able to run the tests (as for JDK). + 2005-12-22 Ito Kazumitsu <[EMAIL PROTECTED]> * kaffe/kaffevm/access.c Index: kaffe/kaffe/kaffevm/access.c diff -u kaffe/kaffe/kaffevm/access.c:1.15 kaffe/kaffe/kaffevm/access.c:1.16 --- kaffe/kaffe/kaffevm/access.c:1.15 Thu Dec 22 13:55:22 2005 +++ kaffe/kaffe/kaffevm/access.c Thu Dec 22 17:51:23 2005 @@ -179,66 +179,9 @@ * is protected. But our experience tells the need for a special * handling of this case. */ - else if( target->accflags & ACC_PROTECTED && instanceof(target, context) ) + else if( instanceof(target, context) ) { class_acc = 1; - } - else if( target->accflags & ACC_PROTECTED ) - { - /* check whether target is non private innerclass of superclass */ - innerClass *ict; - innerClass *icc; - Hjava_lang_Class *outert; - Hjava_lang_Class *outerc; - errorInfo einfo; - ict = icc = NULL; - outert = outerc = NULL; - - /* get class containing the accessed class (the target) */ - if( target->this_inner_index >= 0 ) - { - ict = &target->inner_classes[target->this_inner_index]; - if( ict->outer_class ) - { - outert = getClass(ict->outer_class, target, &einfo); - if( outert == NULL ) - { - discardErrorInfo(&einfo); - } - } - } - /* get class containing the accessing class (the context) */ - if( context->this_inner_index >= 0 ) - { - icc = &context->inner_classes[context->this_inner_index]; - if( icc->outer_class ) - { - outerc = getClass(icc->outer_class, context, &einfo); - if( outerc == NULL ) - { - discardErrorInfo(&einfo); - } - } - } - - if( outerc != NULL ) - { - if ( recursive_instanceof(target, outerc) ) - { - class_acc = 1; - } - else if (outert != NULL) - { - class_acc = recursive_instanceof(outert, outerc); - } - - } - - if ( !class_acc && (outert != NULL) ) - { - class_acc = instanceof(outert, context); - } - } if((context->packageLength == target->packageLength) && Index: kaffe/kaffe/kaffevm/classMethod.c diff -u kaffe/kaffe/kaffevm/classMethod.c:1.149 kaffe/kaffe/kaffevm/classMethod.c:1.150 --- kaffe/kaffe/kaffevm/classMethod.c:1.149 Fri Sep 9 13:53:36 2005 +++ kaffe/kaffe/kaffevm/classMethod.c Thu Dec 22 17:51:23 2005 @@ -1113,7 +1113,6 @@ readu2(&ic->inner_class_accflags, fp); if (c->this_index && ic->inner_class == c->this_index) { - c->accflags = (c->accflags & ~ACC_MASK) | (ic->inner_class_accflags & ACC_MASK); c->this_inner_index = i; } } Index: kaffe/libraries/clib/native/Class.c diff -u kaffe/libraries/clib/native/Class.c:1.86 kaffe/libraries/clib/native/Class.c:1.87 --- kaffe/libraries/clib/native/Class.c:1.86 Sat Aug 13 23:37:23 2005 +++ kaffe/libraries/clib/native/Class.c Thu Dec 22 17:51:23 2005 @@ -291,12 +291,19 @@ jint java_lang_VMClass_getModifiers(struct Hjava_lang_Class* this, - jboolean ignoreInnerClassAttribute UNUSED) + jboolean ignoreInnerClassAttribute) { #ifndef ACC_SUPER #define ACC_SUPER ACC_SYNCHRONISED #endif - return (this->accflags & (ACC_MASK & ~ACC_SUPER)); + accessFlags accflags = this->accflags; + + if (this->this_inner_index >= 0 && !ignoreInnerClassAttribute) + { + assert(this->inner_classes != NULL); + accflags = this->inner_classes[this->this_inner_index].inner_class_accflags; + } + return accflags & (ACC_MASK & ~ACC_SUPER); } HArrayOfObject* @@ -433,8 +440,12 @@ if (unhand(this)->this_inner_index >= 0) { innerClass *ic = unhand(this)->inner_classes; + int oc = ic[unhand(this)->this_inner_index].outer_class; + + if (oc == 0) + return NULL; - ret = getClass (ic[unhand(this)->this_inner_index].outer_class, + ret = getClass (oc, this, &einfo); Index: kaffe/test/regression/TestSerialFields.java diff -u kaffe/test/regression/TestSerialFields.java:1.3 kaffe/test/regression/TestSerialFields.java:1.4 --- kaffe/test/regression/TestSerialFields.java:1.3 Sat Dec 10 19:38:20 2005 +++ kaffe/test/regression/TestSerialFields.java Thu Dec 22 17:51:24 2005 @@ -203,7 +203,7 @@ } - private static class Test0001 // "original" (pristine) version + static class Test0001 // "original" (pristine) version implements Serializable { private static final long serialVersionUID = constantUID; @@ -236,7 +236,7 @@ } - private static class Test0002 // contains doubles + static class Test0002 // contains doubles implements Serializable { private static final long serialVersionUID = constantUID; @@ -262,7 +262,7 @@ } } - private static class Test0005 // missing x,y fields + static class Test0005 // missing x,y fields implements Serializable { private static final long serialVersionUID = constantUID; @@ -287,7 +287,7 @@ } - private static class Test0008 // Compatible via serialPersistentFields... + static class Test0008 // Compatible via serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -317,7 +317,7 @@ } - private static class Test0010 // Compatible, but different (and invalid) serialPersistentFields... + static class Test0010 // Compatible, but different (and invalid) serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -349,7 +349,7 @@ } - private static class Test0011 // Compatible, broken writeObject + static class Test0011 // Compatible, broken writeObject implements Serializable { private static final long serialVersionUID = constantUID; @@ -375,7 +375,7 @@ } } - private static class Test0012 // check defaultReadObject + static class Test0012 // check defaultReadObject implements Serializable { private static final long serialVersionUID = constantUID; @@ -401,7 +401,7 @@ } } - private static class Test0014 // bogus reads/puts + static class Test0014 // bogus reads/puts implements Serializable { private static final long serialVersionUID = constantUID; @@ -429,7 +429,7 @@ } } - private static class Test0015 // impossible field names + static class Test0015 // impossible field names implements Serializable { private static final long serialVersionUID = constantUID; @@ -466,7 +466,7 @@ // XXX JDK1.4 and Kaffe differ on this one (JDK blows up with multiple // readFields()) both Kaffe and JDK1.4 are fine with multiple putFields. - private static class Test0016 // multiple gets/sets + static class Test0016 // multiple gets/sets implements Serializable { private static final long serialVersionUID = constantUID; Index: kaffe/test/regression/TestSerialVersions.java diff -u kaffe/test/regression/TestSerialVersions.java:1.3 kaffe/test/regression/TestSerialVersions.java:1.4 --- kaffe/test/regression/TestSerialVersions.java:1.3 Sat Dec 10 19:38:20 2005 +++ kaffe/test/regression/TestSerialVersions.java Thu Dec 22 17:51:24 2005 @@ -21,7 +21,7 @@ public static final long constantUID = 0x42L; - private static class Test0001 // "original" (pristine) version + static class Test0001 // "original" (pristine) version implements Serializable { private static final long serialVersionUID = constantUID; @@ -34,7 +34,7 @@ } } - private static class Test0002 // mismatch (widen) field types + static class Test0002 // mismatch (widen) field types implements Serializable { private static final long serialVersionUID = constantUID; @@ -47,7 +47,7 @@ } } - private static class Test0003 // mismatch (narrow) field types + static class Test0003 // mismatch (narrow) field types implements Serializable { private static final long serialVersionUID = constantUID; @@ -60,7 +60,7 @@ } } - private static class Test0004 // mismatch (incompatible) field types + static class Test0004 // mismatch (incompatible) field types implements Serializable { private static final long serialVersionUID = constantUID; @@ -73,7 +73,7 @@ } } - private static class Test0005 // missing x,y fields + static class Test0005 // missing x,y fields implements Serializable { private static final long serialVersionUID = constantUID; @@ -84,7 +84,7 @@ } } - private static class Test0052 // missing x (but not y) field + static class Test0052 // missing x (but not y) field implements Serializable { private static final long serialVersionUID = constantUID; @@ -97,7 +97,7 @@ } } - private static class Test0006 // Wrong serialVersionUID + static class Test0006 // Wrong serialVersionUID implements Serializable { private static final long serialVersionUID = constantUID + 0x69; @@ -115,7 +115,7 @@ // I think the serialPersistentFields are really only used for // *writing* objects (in the default)... // Kaffe now does the "right thing" (throws an exception on this case). - private static class Test0007 // Compatible via serialPersistentFields... + static class Test0007 // Compatible via serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -135,7 +135,7 @@ } - private static class Test0008 // Compatible via serialPersistentFields... + static class Test0008 // Compatible via serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -152,7 +152,7 @@ } - private static class Test0009 // Compatible, but bad serialPersistentFields... + static class Test0009 // Compatible, but bad serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -171,7 +171,7 @@ } - private static class Test0010 // Compatible, but different (and invalid) serialPersistentFields... + static class Test0010 // Compatible, but different (and invalid) serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -190,7 +190,7 @@ } - private static class Test0011 // Compatible, but different (and valid) serialPersistentFields... + static class Test0011 // Compatible, but different (and valid) serialPersistentFields... implements Serializable { private static final long serialVersionUID = constantUID; @@ -211,7 +211,7 @@ } } - private static class Test0012 // "Same" as 0011, but with 'transient' keyword + static class Test0012 // "Same" as 0011, but with 'transient' keyword implements Serializable { private static final long serialVersionUID = constantUID; @@ -226,7 +226,7 @@ } } - private static class Test0013 // Battle of the overlapping specs + static class Test0013 // Battle of the overlapping specs implements Serializable { private static final long serialVersionUID = constantUID; @@ -245,7 +245,7 @@ } - private static class Test0014 // Type mis-match but with an array + static class Test0014 // Type mis-match but with an array implements Serializable { private static final long serialVersionUID = constantUID; _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe