[kaffe] CVS kaffe (kaz): kaffe/kaffevm/access.c
Kaffe CVS
cvs-commits at kaffe.org
Tue Dec 13 07:17:07 PST 2005
PatchSet 7001
Date: 2005/12/13 15:08:29
Author: kaz
Branch: HEAD
Tag: (none)
Log:
2005-12-13 Ito Kazumitsu <kaz at maczuka.gcd.org>
* kaffe/kaffevm/access.c
(outerof): New function,
(checkAccess): Corrected the handling of private access.
Members:
ChangeLog:1.4522->1.4523
kaffe/kaffevm/access.c:1.12->1.13
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4522 kaffe/ChangeLog:1.4523
--- kaffe/ChangeLog:1.4522 Tue Dec 13 03:19:23 2005
+++ kaffe/ChangeLog Tue Dec 13 15:08:29 2005
@@ -1,3 +1,9 @@
+2005-12-13 Ito Kazumitsu <kaz at maczuka.gcd.org>
+
+ * kaffe/kaffevm/access.c
+ (outerof): New function,
+ (checkAccess): Corrected the handling of private access.
+
2005-12-13 Dalibor Topic <robilad at kaffe.org>
* libraries/javalib/external/classpath: Resynched GNU Classpath.
Index: kaffe/kaffe/kaffevm/access.c
diff -u kaffe/kaffe/kaffevm/access.c:1.12 kaffe/kaffe/kaffevm/access.c:1.13
--- kaffe/kaffe/kaffevm/access.c:1.12 Fri Aug 19 00:38:31 2005
+++ kaffe/kaffe/kaffevm/access.c Tue Dec 13 15:08:33 2005
@@ -116,7 +116,7 @@
}
/*
- * Returns 1 if oc is an instance of c or the superclass of c ...
+ * Returns 1 if oc or its outer class is an instance of c
*/
static
int recursive_instanceof(Hjava_lang_Class *c, Hjava_lang_Class *oc)
@@ -153,6 +153,45 @@
}
}
+/*
+ * Returns 1 if oc is an outer class of c
+ */
+static
+int outerof (Hjava_lang_Class *c, Hjava_lang_Class *oc)
+{
+ innerClass *ic;
+ Hjava_lang_Class *outer;
+ errorInfo einfo;
+
+ outer = NULL;
+ if( c->this_inner_index >= 0 )
+ {
+ ic = &c->inner_classes[c->this_inner_index];
+ if( ic->outer_class )
+ {
+ outer = getClass(ic->outer_class, c, &einfo);
+ if( outer == NULL )
+ {
+ discardErrorInfo(&einfo);
+ }
+ }
+ }
+ if ( outer != NULL )
+ {
+ if ( oc == outer)
+ {
+ return 1;
+ }
+ else
+ {
+ return outerof(outer, oc);
+ }
+ }
+ else {
+ return 0;
+ }
+}
+
int checkAccess(struct Hjava_lang_Class *context,
struct Hjava_lang_Class *target,
accessFlags target_flags)
@@ -170,6 +209,14 @@
return 1;
}
+ else if ( outerof(target, context) )
+ {
+ /* target is within the context. */
+ class_acc = 1;
+ slot_acc = 1;
+
+ return 1;
+ }
else if( target->accflags & ACC_PUBLIC )
{
/* Public class. */
@@ -244,7 +291,10 @@
{
same_package = 1;
/* Package */
- class_acc = 1;
+ if (!(target->accflags & ACC_PROTECTED))
+ {
+ class_acc = 1;
+ }
}
if( target_flags & ACC_PUBLIC )
@@ -263,12 +313,17 @@
/* Package. */
slot_acc = 1;
}
+/*
+ Commented out because private members get accessible to
+ any context in the same package if target is a nested class.
+
else if( (target->name->data[0] != '[') &&
same_package &&
(target->this_inner_index >= 0) )
{
slot_acc = 1;
}
+*/
else if( context->this_inner_index >= 0 )
{
innerClass *ic;
More information about the kaffe
mailing list