[kaffe] CVS kaffe (guilhem): Fixed class accessibility.

Ito Kazumitsu kaz at maczuka.gcd.org
Wed Dec 21 22:09:47 PST 2005


From: Ito Kazumitsu <kaz at maczuka.gcd.org>
Date: Thu, 22 Dec 2005 11:08:15 +0900 (JST)

> The runtime access control is much simpler than the compile-time
> access control.  And we may be able to omit the checking of nested
> relations of classes at runtime.

Simply omitting the checking of nested relations of classes
causes IllegalAccessError, which was reported in November, 2003.

I am afraid Sun's VM spec:

> A class or interface C is accessible to a class or interface D if and only if
> either of the following conditions are true:
> 
> (Runtime):
>    - C is public.
>    - C and D are members of the same runtime package.

is incomplete and something should be said about the case
where C is protected.

Attached below is my proposed patch.  I have deleted the
checking of outer classes for determining slot_acc,
but kept such checking for determining class_acc.

With this patch applied,

   - All the regression tests pass.
   - Mauve test gnu.testlet.java.lang.Class.newInstance shows the
     same results as Sun's JDK.
   - The testcase attached to
     http://www.kaffe.org/pipermail/kaffe/2003-November/096187.html
     passes.

--- kaffe/kaffevm/access.c.orig	Thu Dec 22 08:45:13 2005
+++ kaffe/kaffevm/access.c	Thu Dec 22 14:42:08 2005
@@ -153,45 +153,6 @@
 	}
 }
 
-/*
- * 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)
@@ -209,20 +170,15 @@
 
 		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. */
 		class_acc = 1;
 	}
-	else if( instanceof(target, context) )
+	/* Sun's VM spec does not refer to the case where the target class
+	 * is protected.
+	 */
+	else if( target->accflags & ACC_PROTECTED && instanceof(target, context) )
 	{
 		class_acc = 1;
 	}
@@ -310,51 +266,6 @@
 		/* 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;
-
-		/*
-		 * Check for an inner class accessing something in the outer.
-		 */
-		ic = &context->inner_classes[context->this_inner_index];
-		if( ic->outer_class )
-		{
-			Hjava_lang_Class *outer;
-			errorInfo einfo;
-			
-			outer = getClass(ic->outer_class, context, &einfo);
-			if( outer != NULL )
-			{
-				if( (target_flags & ACC_PRIVATE) &&
-				    (target == outer) )
-				{
-					/* XXX Not sure about this. */
-					slot_acc = 1;
-				}
-				else if( (target_flags & ACC_PROTECTED) &&
-					 instanceof(target, outer) )
-				{
-					slot_acc = 1;
-				}
-			}
-			else
-			{
-				discardErrorInfo(&einfo);
-			}
-		}
-	}
 	return( class_acc && slot_acc );
 }
 




More information about the kaffe mailing list