[kaffe] CVS kaffe (riccardo): proper system header include
Kaffe CVS
cvs-commits at kaffe.org
Thu Aug 18 08:23:21 PDT 2005
PatchSet 6837
Date: 2005/08/18 15:06:58
Author: riccardo
Branch: HEAD
Tag: (none)
Log:
proper system header include
Members:
ChangeLog:1.4361->1.4362
kaffe/kaffevm/access.c:INITIAL->1.11
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4361 kaffe/ChangeLog:1.4362
--- kaffe/ChangeLog:1.4361 Wed Aug 17 22:38:17 2005
+++ kaffe/ChangeLog Thu Aug 18 15:06:58 2005
@@ -1,3 +1,6 @@
+2005-08-18 Riccardo Mottola <riccardo at kaffe.org>
+ * kaffe/kaffe/kaffevm/access.c: proper system header include
+
2005-08-18 Dalibor Topic <robilad at kaffe.org>
Resynced with GNU Classpath.
===================================================================
Checking out kaffe/kaffe/kaffevm/access.c
RCS: /home/cvs/kaffe/kaffe/kaffe/kaffevm/access.c,v
VERS: 1.11
***************
--- /dev/null Sun Aug 4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/access.c Thu Aug 18 15:23:19 2005
@@ -0,0 +1,414 @@
+/*
+ * access.c
+ * Access flags related functions.
+ *
+ * Copyright (c) 2002, 2003 University of Utah and the Flux Group.
+ * All rights reserved.
+ *
+ * Copyright (c) 2005
+ * The kaffe.org's developers. See ChangeLog for details.
+ *
+ * This file is licensed under the terms of the GNU Public License.
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * Contributed by the Flux Research Group, Department of Computer Science,
+ * University of Utah, http://www.cs.utah.edu/flux/
+ */
+
+
+#include "config.h"
+
+/* include system headers */
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+
+#include "gtypes.h"
+#include "exception.h"
+#include "errors.h"
+#include "access.h"
+#include "support.h"
+#include "classMethod.h"
+#include "lookup.h"
+#include "soft.h"
+
+
+const char *checkAccessFlags(access_type_t type, accessFlags access_flags)
+{
+ const char *retval = NULL;
+
+ if( (type == ACC_TYPE_CLASS) &&
+ (access_flags & ACC_INTERFACE) &&
+ !(access_flags & ACC_ABSTRACT) )
+ {
+ retval = "Abstract flag not set on interface";
+ }
+ else if( (type == ACC_TYPE_CLASS) &&
+ (access_flags & ACC_INTERFACE) &&
+ (access_flags & ACC_FINAL) )
+ {
+ retval = "Interfaces may only have the public and abstract "
+ "flags set";
+ }
+ else if( (type == ACC_TYPE_CLASS) &&
+ ((access_flags & (ACC_FINAL | ACC_ABSTRACT)) ==
+ (ACC_FINAL | ACC_ABSTRACT)) )
+ {
+ retval = "Classes cannot have both final and abstract flags";
+ }
+ else if( (type == ACC_TYPE_CLASS) &&
+ (access_flags & (ACC_PROTECTED | ACC_PRIVATE)) )
+ {
+ retval = "Classes can only be public or package visible";
+ }
+ else if( bitCount(access_flags & (ACC_PUBLIC |
+ ACC_PRIVATE |
+ ACC_PROTECTED)) > 1 )
+ {
+ retval = "More than one protection flag set";
+ }
+ else if( (access_flags & (ACC_FINAL | ACC_VOLATILE)) ==
+ (ACC_FINAL | ACC_VOLATILE) )
+ {
+ retval = "Final and volatile cannot both be set";
+ }
+ else if( (type == ACC_TYPE_INTERFACE_FIELD) &&
+ ((access_flags & (ACC_PUBLIC | ACC_STATIC | ACC_FINAL)) !=
+ (ACC_PUBLIC | ACC_STATIC | ACC_FINAL)) )
+ {
+ retval = "Interface fields must have the public, static, and "
+ "final flags set";
+ }
+ else if( (type == ACC_TYPE_INTERFACE_METHOD) &&
+ ((access_flags & (ACC_PUBLIC | ACC_ABSTRACT)) !=
+ (ACC_PUBLIC | ACC_ABSTRACT)) )
+ {
+ retval = "Interface methods must have the public and abstract "
+ "flags set";
+ }
+ else if( ((type == ACC_TYPE_METHOD) ||
+ (type == ACC_TYPE_INTERFACE_METHOD)) &&
+ (access_flags & ACC_ABSTRACT) &&
+ (access_flags & (ACC_FINAL |
+ ACC_NATIVE |
+ ACC_PRIVATE |
+ ACC_STATIC |
+ ACC_SYNCHRONISED)) )
+ {
+ retval = "Abstract is incompatible with final, native, "
+ "private, static, strict, and synchronized";
+ }
+ 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)
+{
+ int class_acc = 0, slot_acc = 0, same_package = 0;
+
+ assert(context);
+ assert(target);
+
+ if( context == target )
+ {
+ /* Same class. */
+ class_acc = 1;
+ slot_acc = 1;
+
+ return 1;
+ }
+ else if( target->accflags & ACC_PUBLIC )
+ {
+ /* Public class. */
+ class_acc = 1;
+ }
+ 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) &&
+ !strncmp(context->name->data,
+ target->name->data,
+ context->packageLength) )
+ {
+ same_package = 1;
+ /* Package */
+ class_acc = 1;
+ }
+
+ if( target_flags & ACC_PUBLIC )
+ {
+ /* Public slot. */
+ slot_acc = 1;
+ }
+ else if( (target_flags & ACC_PROTECTED) &&
+ instanceof(target, context) )
+ {
+ /* Subclass. */
+ slot_acc = 1;
+ }
+ else if( same_package && !(target_flags & ACC_PRIVATE) )
+ {
+ /* Package. */
+ slot_acc = 1;
+ }
+ 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 );
+}
+
+/*
+ * Helper method for checkMethodAccess, finds the next super class that
+ * contains the given method. XXX is this right?
+ *
+ * cl - The current class, the search starts at this class' super class.
+ * returns - The next super class containing the given method or NULL if no
+ * more classes were found to have the method.
+ */
+static
+Hjava_lang_Class *findSuperMethod(Hjava_lang_Class *orig_cl, Method *meth)
+{
+ Hjava_lang_Class *cl, *retval = NULL;
+
+ for( cl = orig_cl->superclass; cl && !retval; cl = cl->superclass )
+ {
+ int lpc;
+
+ for( lpc = 0; lpc < CLASS_NMETHODS(cl) && !retval; lpc++ )
+ {
+ if( CLASS_METHODS(cl)[lpc].idx == meth->idx )
+ {
+ retval = orig_cl->superclass;
+ }
+ }
+ }
+ return( retval );
+}
+
+int checkMethodAccess(struct Hjava_lang_Class *context,
+ struct Hjava_lang_Class *target,
+ Method *meth)
+{
+ int retval = 0;
+
+ if( (target == meth->class) ||
+ checkMethodAccess(target, meth->class, meth) )
+ {
+ Hjava_lang_Class *cl;
+
+ cl = target;
+ while( cl && !retval )
+ {
+ if( checkAccess(context, cl, meth->accflags) )
+ {
+ /* Good to go. */
+ retval = 1;
+ }
+ else if( meth->idx != -1 )
+ {
+ /* Look for the method in a super class. */
+ cl = findSuperMethod(cl, meth);
+ }
+ else if( meth->class != cl )
+ {
+ /*
+ * The method is final/static and not in the
+ * current class, try the super.
+ */
+ cl = cl->superclass;
+ }
+ else
+ {
+ cl = NULL;
+ }
+ }
+ }
+
+ return( retval );
+}
+
+static
+Hjava_lang_Class *findSuperField(Hjava_lang_Class *orig_cl, Field *field)
+{
+ Hjava_lang_Class *retval = NULL;
+
+ if( field->clazz != orig_cl )
+ {
+ retval = orig_cl->superclass;
+ }
+ return( retval );
+}
+
+int checkFieldAccess(struct Hjava_lang_Class *context,
+ struct Hjava_lang_Class *target,
+ Field *field)
+{
+ int retval = 0;
+
+ if( (target == field->clazz) ||
+ checkFieldAccess(target, field->clazz, field) )
+ {
+ Hjava_lang_Class *cl;
+
+ cl = target;
+ while( cl && !retval )
+ {
+ if( checkAccess(context, cl, field->accflags) )
+ {
+ /* Good to go. */
+ retval = 1;
+ }
+ else
+ {
+ /* Look for the method in a super class. */
+ cl = findSuperField(cl, field);
+ }
+ }
+ }
+ return( retval );
+}
More information about the kaffe
mailing list