[kaffe] CVS kaffe (kaz): kaffe/kaffevm/access.c:
Kaffe CVS
Kaffe Mailing List <kaffe@kaffe.org>
Mon Nov 17 07:39:01 2003
PatchSet 4165
Date: 2003/11/17 15:32:38
Author: kaz
Branch: HEAD
Tag: (none)
Log:
* kaffe/kaffevm/access.c:
(checkAccess) corrected to avoid java.lang.IllegalAccessError
using new function recursive_instanceof.
Members:
ChangeLog:1.1757->1.1758
kaffe/kaffevm/access.c:1.5->1.6
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1757 kaffe/ChangeLog:1.1758
--- kaffe/ChangeLog:1.1757 Thu Nov 13 13:54:52 2003
+++ kaffe/ChangeLog Mon Nov 17 15:32:38 2003
@@ -1,3 +1,9 @@
+2003-11-17 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * kaffe/kaffevm/access.c:
+ (checkAccess) corrected to avoid java.lang.IllegalAccessError
+ using new function recursive_instanceof.
+
2003-11-13 Dalibor Topic <robilad@kaffe.org>
* config/config.alias:
Index: kaffe/kaffe/kaffevm/access.c
diff -u kaffe/kaffe/kaffevm/access.c:1.5 kaffe/kaffe/kaffevm/access.c:1.6
--- kaffe/kaffe/kaffevm/access.c:1.5 Wed Nov 12 15:17:14 2003
+++ kaffe/kaffe/kaffevm/access.c Mon Nov 17 15:32:40 2003
@@ -92,6 +92,44 @@
return( retval );
}
+/*
+ * Returns 1 if oc is an instance of c or the superclass of c ...
+ */
+static
+int recursive_instanceof(Hjava_lang_Class *c, Hjava_lang_Class *oc)
+{
+ if ( instanceof(c, oc) )
+ {
+ return 1;
+ }
+ else
+ {
+ innerClass *ic;
+ Hjava_lang_Class *outer;
+ errorInfo einfo;
+ ic = NULL;
+ outer = NULL;
+
+ if( oc->this_inner_index >= 0 )
+ {
+ ic = &oc->inner_classes[oc->this_inner_index];
+ if( ic->outer_class )
+ {
+ outer = getClass(ic->outer_class, oc, &einfo);
+ if( outer == NULL )
+ {
+ discardErrorInfo(&einfo);
+ }
+ }
+ }
+ if ( outer != NULL )
+ {
+ return recursive_instanceof(c, outer);
+ }
+ return 0;
+ }
+}
+
int checkAccess(struct Hjava_lang_Class *context,
struct Hjava_lang_Class *target,
accessFlags target_flags)
@@ -154,21 +192,23 @@
}
}
- if( outert != NULL )
+ if( outerc != NULL )
{
- if( instanceof(outert, context) )
- {
+ if ( recursive_instanceof(target, outerc) )
+ {
class_acc = 1;
}
- else if (outerc != NULL)
+ else if (outert != NULL)
{
- class_acc = instanceof(outert, outerc);
+ class_acc = recursive_instanceof(outert, outerc);
}
+
}
- else if( outerc != NULL )
+ else if ( outert != NULL )
{
- class_acc = instanceof(target, outerc);
+ class_acc = instanceof(outert, context);
}
+
}
if((context->packageLength == target->packageLength) &&