OSDN Git Service

PR libgcj/12001:
[pf3gnuchains/gcc-fork.git] / libjava / resolve.cc
index 7cf0b0a..d71e125 100644 (file)
@@ -32,6 +32,7 @@ details.  */
 #include <java/lang/AbstractMethodError.h>
 #include <java/lang/NoClassDefFoundError.h>
 #include <java/lang/IncompatibleClassChangeError.h>
+#include <java/lang/VMClassLoader.h>
 #include <java/lang/reflect/Modifier.h>
 
 using namespace gcj;
@@ -166,15 +167,7 @@ _Jv_ResolvePoolEntry (jclass klass, int index)
              if (! _Jv_equalUtf8Consts (field->name, field_name))
                continue;
 
-             // now, check field access. 
-
-             if (   (cls == klass)
-                 || ((field->flags & Modifier::PUBLIC) != 0)
-                 || (((field->flags & Modifier::PROTECTED) != 0)
-                     && cls->isAssignableFrom (klass))
-                 || (((field->flags & Modifier::PRIVATE) == 0)
-                     && _Jv_ClassNameSamePackage (cls->name,
-                                                  klass->name)))
+             if (_Jv_CheckAccess (klass, cls, field->flags))
                {
                  /* resove the field using the class' own loader
                     if necessary */
@@ -347,20 +340,10 @@ _Jv_SearchMethodInClass (jclass cls, jclass klass,
                                    method_signature)))
        continue;
 
-      if (cls == klass 
-         || ((method->accflags & Modifier::PUBLIC) != 0)
-         || (((method->accflags & Modifier::PROTECTED) != 0)
-             && cls->isAssignableFrom (klass))
-         || (((method->accflags & Modifier::PRIVATE) == 0)
-             && _Jv_ClassNameSamePackage (cls->name,
-                                          klass->name)))
-       {
-         return method;
-       }
+      if (_Jv_CheckAccess (klass, cls, method->accflags))
+       return method;
       else
-       {
-         throw new java::lang::IllegalAccessError;
-       }
+       throw new java::lang::IllegalAccessError;
     }
   return 0;
 }
@@ -453,7 +436,7 @@ _Jv_PrepareClass(jclass klass)
   // resolved.
 
   if (klass->superclass)
-    java::lang::ClassLoader::resolveClass0 (klass->superclass);
+    java::lang::VMClassLoader::resolveClass (klass->superclass);
 
   _Jv_InterpClass *clz = (_Jv_InterpClass*)klass;
 
@@ -592,6 +575,16 @@ _Jv_PrepareClass(jclass klass)
          _Jv_InterpMethod *im = reinterpret_cast<_Jv_InterpMethod *> (imeth);
          _Jv_VerifyMethod (im);
          clz->methods[i].ncode = im->ncode ();
+
+         // Resolve ctable entries pointing to this method.  See
+         // _Jv_Defer_Resolution.
+         void **code = (void **)imeth->deferred;
+         while (code)
+           {
+             void **target = (void **)*code;
+             *code = clz->methods[i].ncode;
+             code = target;
+           }
        }
     }