[kaffe] CVS kaffe (stack): Fix inner->outer class access check

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Sun Aug 31 20:24:02 2003


PatchSet 4005 
Date: 2003/09/01 03:06:57
Author: stack
Branch: HEAD
Tag: (none) 
Log:
Fix inner->outer class access check

Members: 
	ChangeLog:1.1601->1.1602 
	kaffe/kaffevm/access.c:1.1->1.2 
	kaffe/kaffevm/classMethod.c:1.109->1.110 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1601 kaffe/ChangeLog:1.1602
--- kaffe/ChangeLog:1.1601	Sun Aug 31 23:13:33 2003
+++ kaffe/ChangeLog	Mon Sep  1 03:06:57 2003
@@ -1,3 +1,11 @@
+2003-08-31  Timothy S. Stack <stack@cs.utah.edu>
+
+	* kaffe/kaffevm/access.c:
+	Allow inner classes to access members in the outer class.
+
+	* kaffe/kaffevm/classMethod.c:
+	Fix initial value of this_inner_index in the class struct.
+
 2003-08-31  Ito Kazumitsu <kaz@maczuka.gcd.org>
 
 	* libraries/javalib/java/text/SimpleDateFormat.java:
Index: kaffe/kaffe/kaffevm/access.c
diff -u kaffe/kaffe/kaffevm/access.c:1.1 kaffe/kaffe/kaffevm/access.c:1.2
--- kaffe/kaffe/kaffevm/access.c:1.1	Sun Aug 31 22:09:01 2003
+++ kaffe/kaffe/kaffevm/access.c	Mon Sep  1 03:06:58 2003
@@ -97,7 +97,7 @@
 		accessFlags target_flags)
 {
 	int class_acc = 0, slot_acc = 0, same_package = 0;
-
+	
 	assert(context);
 	assert(target);
 	
@@ -145,11 +145,44 @@
 	}
 	else if( (target->name->data[0] != '[') &&
 		 same_package &&
-		 target->this_inner_index )
+		 (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 );
 }
 
Index: kaffe/kaffe/kaffevm/classMethod.c
diff -u kaffe/kaffe/kaffevm/classMethod.c:1.109 kaffe/kaffe/kaffevm/classMethod.c:1.110
--- kaffe/kaffe/kaffevm/classMethod.c:1.109	Sun Aug 31 22:09:01 2003
+++ kaffe/kaffe/kaffevm/classMethod.c	Mon Sep  1 03:06:58 2003
@@ -974,6 +974,7 @@
 	cl->this_index = this_index;
 	cl->inner_classes = 0;
 	cl->nr_inner_classes = 0;
+	cl->this_inner_index = -1;
 	return 1;
 }
 
@@ -1073,7 +1074,7 @@
 
 		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 = nr;
+		    c->this_inner_index = i;
 		}
 	}
 	return true;