This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gcjx] Patch: FYI: merge verifiers


I'm checking this in on the gcjx branch.

This patch changes libgcj to use the same verifier as the compiler.
It also fixes libgcj to reject class files with unrecognizable version
numbers (PR 16032), and to understand 1.5 class files.  Combined with
the verifier in gcjx, this latter change lets us, I think (this is
untested), properly handle class files with the new 'ldc <class>'
opcode, i.e. those generated by a 1.5 compiler.

Tom

Index: gcjx/ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* bytecode/verify.cc (branch_prepass): Cast argument to sprintf.
	(verify_instructions_0): Likewise.
	(VFY_FAST_OPCODES): Changed sense of #ifdef.

Index: libjava/ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	PR libgcj/16032:
	* java/lang/Class.h (Class): Added friend class.
	* include/verify.h (vfy_is_15): Implement.
	(VFY_FAST_OPCODES): New define.
	Updated #includes.
	(vfy_is_static): Use Modifier, not ACC_*.
	(vfy_is_abstract): Likewise.
	(vfy_hand_off_flags): New function.
	(vfy_fail): Cast argument to 'append'.
	(vfy_get_exceptions): Rewrote.
	(vfy_tag): Fixed typo.
	(vfy_load_indexes): Use correct slot in constant pool.
	(vfy_constants): Changed type.
	(vfy_uint_16): Likewise.
	(vfy_find_class): Removed argument name.
	(vfy_get_pool_class): Likewise.
	(vfy_iface_iterator_begin): Likewise.
	(vfy_get_interface): Likewise.
	(vfy_make_string): Added cast.
	(vfy_object_type): Fixed typo.
	(vfy_string_type): Likewise.
	(vfy_throwable_type): Likewise.
	(vfy_class_type): Likewise.
	(vfy_fail): Added argument name.
	* defineclass.cc (handleCodeAttribute): Set new field.
	(MAJOR_1_1, MINOR_1_1, MAJOR_1_2, MINOR_1_2, MAJOR_1_3, MINOR_1_3,
	MAJOR_1_4, MINOR_1_4, MAJOR_1_5, MINOR_1_5): New defines.
	(parse): Check version numbers.
	(_Jv_ClassReader::is_15): New field.
	(_Jv_ClassReader): Initialize it.
	* include/java-interp.h (_Jv_InterpMethod::is_15): New field.
	(class _Jv_InterpException): Added friend class.
	(class _Jv_MethodBase): Likewise.
	(class _Jv_InterpMethod): Likewise.
	* configure, Makefile.in: Rebuilt.
	* configure.ac: Create verify.cc as a link.
	* verify.cc: Removed.

Index: gcjx/bytecode/verify.cc
===================================================================
RCS file: /cvs/gcc/gcc/gcjx/bytecode/Attic/verify.cc,v
retrieving revision 1.1.2.6
diff -u -r1.1.2.6 verify.cc
--- gcjx/bytecode/verify.cc 4 Apr 2005 00:01:14 -0000 1.1.2.6
+++ gcjx/bytecode/verify.cc 17 Apr 2005 20:55:42 -0000
@@ -1510,7 +1510,7 @@
         if (b != 0)
 	  {
 	    char buf[30];
-	    sprintf (buf, "found nonzero padding byte %d", b);
+	    sprintf (buf, "found nonzero padding byte %d", int (b));
 	    verify_fail (buf);
 	  }
       }
@@ -1831,7 +1831,7 @@
 		{
 		  char buf[50];
 		  sprintf (buf, "invalid tableswitch: low=%d, high=%d",
-			   low, high);
+			   int (low), int (high));
 		  verify_fail (buf, start_PC);
 		}
 	      for (int i = low; i <= high; ++i)
@@ -1876,7 +1876,7 @@
 
 	  // These are unused here, but we call them out explicitly
 	  // so that -Wswitch-enum doesn't complain.
-#ifndef VFY_FAST_OPCODES
+#ifdef VFY_FAST_OPCODES
 	  case op_putfield_1:
 	  case op_putfield_2:
 	  case op_putfield_4:
@@ -2882,7 +2882,7 @@
 		    {
 		      char buf[50];
 		      sprintf (buf, "invokeinterface dummy byte is %d "
-			       "instead of 0", dummy_byte);
+			       "instead of 0", int (dummy_byte));
 		      verify_fail (buf);
 		    }
 		}
@@ -3083,7 +3083,7 @@
 
 	  // These are unused here, but we call them out explicitly
 	  // so that -Wswitch-enum doesn't complain.
-#ifndef VFY_FAST_OPCODES
+#ifdef VFY_FAST_OPCODES
 	  case op_putfield_1:
 	  case op_putfield_2:
 	  case op_putfield_4:
Index: libjava/configure.ac
===================================================================
RCS file: /cvs/gcc/gcc/libjava/configure.ac,v
retrieving revision 1.16.2.1
diff -u -r1.16.2.1 configure.ac
--- libjava/configure.ac 17 Apr 2005 18:34:08 -0000 1.16.2.1
+++ libjava/configure.ac 17 Apr 2005 20:55:57 -0000
@@ -1376,6 +1376,8 @@
   multilib_arg=
 fi
 
+# Get the verifier source from gcjx.
+AC_CONFIG_LINKS(verify.cc:../gcjx/bytecode/verify.cc)
 
 
 here=`${PWDCMD-pwd}`
Index: libjava/defineclass.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/defineclass.cc,v
retrieving revision 1.43
diff -u -r1.43 defineclass.cc
--- libjava/defineclass.cc 10 Jan 2005 19:39:25 -0000 1.43
+++ libjava/defineclass.cc 17 Apr 2005 20:55:57 -0000
@@ -70,7 +70,8 @@
  * public or private members here.
  */
 
-struct _Jv_ClassReader {
+struct _Jv_ClassReader
+{
 
   // do verification?  Currently, there is no option to disable this.
   // This flag just controls the verificaiton done by the class loader;
@@ -100,10 +101,14 @@
 
   // the class to define (see java-interp.h)
   jclass	   def;
-  
+
   // the classes associated interpreter data.
   _Jv_InterpClass  *def_interp;
 
+  // True if this is a 1.5 class file.
+  bool             is_15;
+
+
   /* check that the given number of input bytes are available */
   inline void check (int num)
   {
@@ -228,6 +233,8 @@
     bytes  = (unsigned char*) (elements (data)+offset);
     len    = length;
     pos    = 0;
+    is_15  = false;
+
     def    = klass;
     def->size_in_bytes = -1;
     def->vtable_method_count = -1;
@@ -291,19 +298,32 @@
 
 /** This section defines the parsing/scanning of the class data */
 
+// Major and minor version numbers for various releases.
+#define MAJOR_1_1 45
+#define MINOR_1_1  3
+#define MAJOR_1_2 46
+#define MINOR_1_2  0
+#define MAJOR_1_3 47
+#define MINOR_1_3  0
+#define MAJOR_1_4 48
+#define MINOR_1_4  0
+#define MAJOR_1_5 49
+#define MINOR_1_5  0
+
 void
 _Jv_ClassReader::parse ()
 {
   int magic = read4 ();
-
-  /* FIXME: Decide which range of version numbers to allow */
-
-  /* int minor_version = */ read2u ();
-  /* int major_verson  = */ read2u ();
-
   if (magic != (int) 0xCAFEBABE)
     throw_class_format_error ("bad magic number");
 
+  int minor_version = read2u ();
+  int major_version = read2u ();
+  if (major_version < MAJOR_1_1 || major_version > MAJOR_1_5
+      || (major_version == MAJOR_1_5 && minor_version > MINOR_1_5))
+    throw_class_format_error ("unrecognized class file version");
+  is_15 = (major_version == MAJOR_1_5);
+
   pool_count = read2u ();
 
   read_constpool ();
@@ -1278,6 +1298,7 @@
   method->max_locals     = max_locals;
   method->code_length    = code_length;
   method->exc_count      = exc_table_length;
+  method->is_15          = is_15;
   method->defining_class = def;
   method->self           = &def->methods[method_index];
   method->prepared       = NULL;
Index: libjava/include/java-interp.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/java-interp.h,v
retrieving revision 1.27
diff -u -r1.27 java-interp.h
--- libjava/include/java-interp.h 27 Nov 2004 12:37:32 -0000 1.27
+++ libjava/include/java-interp.h 17 Apr 2005 20:55:57 -0000
@@ -1,6 +1,6 @@
 // java-interp.h - Header file for the bytecode interpreter.  -*- c++ -*-
 
-/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004  Free Software Foundation
+/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -70,6 +70,7 @@
   friend class _Jv_ClassReader;
   friend class _Jv_InterpMethod;
   friend class _Jv_BytecodeVerifier;
+  friend class _Jv_VerifyGlue;
 };
 
 // Base class for method representations.  Subclasses are interpreted
@@ -77,6 +78,7 @@
 class _Jv_MethodBase
 {
 protected:
+
   // The class which defined this method.
   jclass defining_class;
 
@@ -87,6 +89,8 @@
   _Jv_ushort args_raw_size;
 
   friend class _Jv_InterpreterEngine;
+  friend class _Jv_VerifyGlue;
+  friend class _Jv_BytecodeVerifier;
 
 public:
   _Jv_Method *get_method ()
@@ -102,6 +106,7 @@
   int              code_length;
 
   _Jv_ushort       exc_count;
+  bool             is_15;
 
   void *prepared;
 
@@ -145,7 +150,7 @@
   friend class gnu::gcj::runtime::NameFinder;
   friend class gnu::gcj::runtime::StackTrace;
   friend class _Jv_InterpreterEngine;
-  
+  friend class _Jv_VerifyGlue;
 
 #ifdef JV_MARKOBJ_DECL
   friend JV_MARKOBJ_DECL;
@@ -174,7 +179,8 @@
   return klass->interpreted_methods;
 }
 
-struct _Jv_ResolvedMethod {
+struct _Jv_ResolvedMethod
+{
   jint            stack_item_count;	
   jint            vtable_index;	
   jclass          klass;
Index: libjava/include/verify.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/Attic/verify.h,v
retrieving revision 1.1.2.2
diff -u -r1.1.2.2 verify.h
--- libjava/include/verify.h 3 Apr 2005 23:40:02 -0000 1.1.2.2
+++ libjava/include/verify.h 17 Apr 2005 20:55:57 -0000
@@ -27,25 +27,198 @@
 #ifndef JV_VERIFY_H
 #define JV_VERIFY_H
 
+#include <config.h>
+
+#include <jvm.h>
+#include <gcj/cni.h>
+#include <java-insns.h>
+#include <java-interp.h>
+
 #include "java-cpool.h"
 #include "java/lang/Class.h"
+#include "java/lang/StringBuffer.h"
+#include "java/lang/VerifyError.h"
+#include "java/lang/reflect/Modifier.h"
+
+// We declare the fast opcodes, so tell the verifier to include them.
+#define VFY_FAST_OPCODES
+
+#define VFY_PRIMITIVE_CLASS(name) JvPrimClass (name)
 
-typedef _Jv_Constants *vfy_constants;
+typedef _Jv_Constants vfy_constants;
 
 typedef _Jv_Utf8Const *vfy_string;
 
 typedef jclass vfy_jclass;
 
-typedef jchar vfy_uint_16;
+typedef _Jv_ushort vfy_uint_16;
 
 typedef _Jv_InterpException vfy_exception;
 
 typedef _Jv_InterpMethod vfy_method;
 
-inline vfy_constants *vfy_get_constants (vfy_method *method)
-{
-  return &method->defining_class->constants;
-}
+typedef int vfy_iface_iterator;
+
+// It is simplest to put all our methods into a class and then add
+// #defines to make the verifier happy.  This lets us declare this
+// class as a friend in a few places.
+class _Jv_VerifyGlue
+{
+ public:
+
+  static inline vfy_constants *get_constants (vfy_method *method)
+  {
+    return &method->defining_class->constants;
+  }
+
+  static inline vfy_string get_signature (vfy_method *method)
+  {
+    return method->self->signature;
+  }
+
+  static inline vfy_string get_method_name (vfy_method *method)
+  {
+    return method->self->name;
+  }
+
+  static inline bool is_static (vfy_method *method)
+  {
+    return (method->self->accflags
+	    & java::lang::reflect::Modifier::STATIC) != 0;
+  }
+
+  static inline const unsigned char *get_bytecode (vfy_method *method)
+  {
+    return method->bytecode ();
+  }
+
+  static inline vfy_exception *get_exceptions (vfy_method *method)
+  {
+    return method->exceptions ();
+  }
+
+  static inline void get_exception (vfy_exception *table, int index,
+				    int *handler, int *start,
+				    int *end, int *handler_type)
+  {
+    *handler = table[index].handler_pc.i;
+    *start = table[index].start_pc.i;
+    *end = table[index].end_pc.i;
+    *handler_type = table[index].handler_type.i;
+  }
+
+  static inline int get_constants_size (vfy_method *method)
+  {
+    return method->defining_class->constants.size;
+  }
+
+  /**
+   * Tests whether class k has a method with a given name and
+   * descriptor.  Most verifiers don't check this, so implementations
+   * are free to simply return true regardless, and report the problem
+   * later with a NoSuchMethodException at runtime or whatever.  gjcx
+   * can use this to check the bytecode it emits.
+   */
+  static inline bool has_method (vfy_jclass k, vfy_string method_name,
+				 vfy_string method_descriptor)
+  {
+    for (int i = 0; i < k->method_count; ++i)
+      {
+	if (_Jv_equalUtf8Consts (k->methods[i].name, method_name)
+	    && _Jv_equalUtf8Consts (k->methods[i].signature,
+				    method_descriptor))
+	  return true;
+      }
+    return false;
+  }
+
+  static inline vfy_jclass find_class (vfy_method *, vfy_jclass context,
+				       vfy_string name)
+  {
+    using namespace java::lang;
+    ClassLoader *loader = context->getClassLoaderInternal();
+    // We might see either kind of name.  Sigh.
+    vfy_jclass klass;
+    if (name->first() == 'L' && name->limit()[-1] == ';')
+      klass = _Jv_FindClassFromSignature (name->chars(), loader);
+    else
+      klass = Class::forName (_Jv_NewStringUtf8Const (name), false, loader);
+    return klass;
+  }
+
+  static inline vfy_jclass get_pool_resolved_class (vfy_method *method,
+						    vfy_constants *pool,
+						    int index)
+  {
+    return find_class (method, method->defining_class, pool->data[index].utf8);
+  }
+
+  // Return true if the class declares a field with the given name.
+  // The type of the field doesn't matter.
+  static inline bool class_has_field_p (vfy_jclass type, vfy_string name)
+  {
+    for (int i = 0; i < type->field_count; ++i)
+      {
+	if (_Jv_equalUtf8Consts (type->fields[i].name, name))
+	  return true;
+      }
+    return false;
+  }
+
+  static inline vfy_string get_class_name (vfy_jclass klass)
+  {
+    return klass->name;
+  }
+
+  static inline char get_primitive_char (vfy_jclass klass)
+  {
+    return char (klass->method_count);
+  }
+
+  static inline vfy_iface_iterator iface_iterator_begin (vfy_jclass)
+  {
+    return 0;
+  }
+
+  static inline bool iface_iterator_done (vfy_jclass klass,
+					  vfy_iface_iterator iter)
+  {
+    return iter == klass->interface_count;
+  }
+
+  static inline vfy_jclass get_interface (vfy_jclass klass,
+					  vfy_iface_iterator n)
+  {
+    return klass->getInterface (n);
+  }
+
+  // Return true if this method comes from a 1.5 class file.
+  static inline bool is_15 (vfy_method *method)
+  {
+    return method->is_15;
+  }
+};
+
+// See above to understand these defines.
+#define vfy_get_constants _Jv_VerifyGlue::get_constants
+#define vfy_get_signature _Jv_VerifyGlue::get_signature
+#define vfy_get_method_name _Jv_VerifyGlue::get_method_name
+#define vfy_is_static _Jv_VerifyGlue::is_static
+#define vfy_get_bytecode _Jv_VerifyGlue::get_bytecode
+#define vfy_get_exceptions _Jv_VerifyGlue::get_exceptions
+#define vfy_get_exception _Jv_VerifyGlue::get_exception
+#define vfy_get_constants_size _Jv_VerifyGlue::get_constants_size
+#define vfy_has_method _Jv_VerifyGlue::has_method
+#define vfy_find_class _Jv_VerifyGlue::find_class
+#define vfy_get_pool_resolved_class _Jv_VerifyGlue::get_pool_resolved_class
+#define vfy_class_has_field_p _Jv_VerifyGlue::class_has_field_p
+#define vfy_get_class_name _Jv_VerifyGlue::get_class_name
+#define vfy_get_primitive_char _Jv_VerifyGlue::get_primitive_char
+#define vfy_iface_iterator_begin _Jv_VerifyGlue::iface_iterator_begin
+#define vfy_iface_iterator_done _Jv_VerifyGlue::iface_iterator_done
+#define vfy_get_interface _Jv_VerifyGlue::get_interface
+#define vfy_is_15 _Jv_VerifyGlue::is_15
+
 
 inline void *vfy_alloc (size_t bytes)
 {
@@ -74,7 +247,7 @@
 
 inline vfy_string vfy_clinit_name (void)
 {
-  return gcj:clinit_name;
+  return gcj::clinit_name;
 }
 
 int vfy_count_arguments (vfy_string signature)
@@ -82,54 +255,16 @@
   return _Jv_count_arguments (signature, false);
 }
 
-inline vfy_string vfy_get_signature (vfy_method *method)
-{
-  return method->self->signature;
-}
-
-inline vfy_string vfy_get_method_name (vfy_method *method)
-{
-  return method->self->name;
-}
-
-inline bool vfy_is_static (vfy_method *method)
-{
-  return (method->self->accflags & ACC_STATIC) != 0;
-}
-
-inline const unsigned char *vfy_get_bytecode (vfy_method *method)
-{
-  return method->bytecode ();
-}
-
-inline vfy_exception *vfy_get_exceptions (vfy_method *method)
-{
-  return method->block->get_exceptions ();
-}
-
-inline void vfy_get_exception (vfy_exception *table, int index, int *handler,
-			       int *start, int *end, int *handler_type)
-{
-  *handler = table[index].handler_pc.i;
-  *start = table[index].start_pc.i;
-  *end = table[index].end_pc.i;
-  *handler_type = table[index].handler_type.i;
-}
-
 inline int vfy_tag (vfy_constants *pool, int index)
 {
-  return pool->tag[index];
+  return pool->tags[index];
 }
 
 inline void vfy_load_indexes (vfy_constants *pool, int index,
 			      vfy_uint_16 *index0, vfy_uint_16 *index1)
 {
-  _Jv_loadIndexes (pool->data, *index0, *index1);
-}
 
-inline int vfy_get_constants_size (vfy_method *method)
-{
-  return method->defining_class->constants.size;
+  _Jv_loadIndexes (&pool->data[index], *index0, *index1);
 }
 
 inline vfy_string vfy_get_pool_string (vfy_constants *pool, int index)
@@ -137,96 +272,16 @@
   return pool->data[index].utf8;
 }
 
-inline vfy_jclass vfy_find_class (vfy_method *method, vfy_jclass context,
-				  vfy_string name)
-{
-  using namespace java::lang;
-  ClassLoader *loader = context->getClassLoaderInternal();
-  // We might see either kind of name.  Sigh.
-  vfy_jclass klass;
-  if (name->first() == 'L' && name->limit()[-1] == ';')
-    klass = _Jv_FindClassFromSignature (name->chars(), loader);
-  else
-    klass = Class::forName (_Jv_NewStringUtf8Const (name), false, loader);
-  return klass;
-}
-
-/**
- * Tests whether class k has a method with a given name and descriptor. Most
- * verifiers don't check this, so implementations are free to simply return
- * true regardless, and report the problem later with a NoSuchMethodException
- * at runtime or whatever. gjcx can use this to check the bytecode it emits.
- */
-inline bool vfy_has_method (vfy_jclass k, vfy_string method_name,
-                            vfy_string method_descriptor)
-{
-  for (int i = 0; i < k->method_count; ++i)
-    {
-      if (_Jv_equalUtf8Consts (k->methods[i].name, method_name)
-	  && _Jv_equalUtf8Consts (k->methods[i].signature, method_descriptor))
-	return true;
-    }
-  return false;
-}
-
-inline vfy_jclass vfy_get_pool_resolved_class (vfy_method *method,
-					       vfy_constants *pool,
-					       int index)
-{
-  return vfy_find_class (method, method->declaring_class,
-			 pool->data[index].utf8);
-}
-
-inline vfy_string vfy_get_pool_class (vfy_method *method, vfy_constants *pool,
+inline vfy_string vfy_get_pool_class (vfy_method *, vfy_constants *pool,
 				      int index)
 {
   // FIXME: is pool linked at this point?
   return pool->data[index].utf8;
 }
 
-// Return true if the class declares a field with the given name.  The
-// type of the field doesn't matter.
-inline bool vfy_class_has_field_p (vfy_jclass type, vfy_string name)
-{
-  for (int i = 0; i < type->field_count; ++i)
-    {
-      if (_Jv_equalUtf8Consts (type->fields[i].name, name))
-	return true;
-    }
-  return false;
-}
-
 inline vfy_string vfy_make_string (const char *s, int len)
 {
-  return _Jv_makeUtf8Const (s, len);
-}
-
-inline vfy_string vfy_get_class_name (vfy_jclass klass)
-{
-  return klass->name;
-}
-
-inline char vfy_get_primitive_char (vfy_jclass klass)
-{
-  return char (klass->method_count);
-}
-
-
-typedef int vfy_iface_iterator;
-
-inline vfy_iface_iterator vfy_iface_iterator_begin (vfy_jclass klass)
-{
-  return 0;
-}
-
-inline bool vfy_iface_iterator_done (vfy_jclass klass, vfy_iface_iterator iter)
-{
-  return iter == klass->interface_count;
-}
-
-inline vfy_jclass vfy_get_interface (vfy_jclass klass, vfy_iface_iterator iter)
-{
-  return klass->interface_count;
+  return _Jv_makeUtf8Const (const_cast<char *> (s), len);
 }
 
 inline bool vfy_is_array (vfy_jclass klass)
@@ -262,31 +317,32 @@
 
 inline bool vfy_is_abstract (vfy_jclass klass)
 {
-  return (klass->getModifiers () & ACC_ABSTRACT) != 0;
+  return (klass->getModifiers ()
+	  & java::lang::reflect::Modifier::ABSTRACT) != 0;
 }
 
 inline vfy_jclass vfy_object_type (void)
 {
-  return &java::lang::Object::class$
+  return &java::lang::Object::class$;
 }
 
 inline vfy_jclass vfy_string_type (void)
 {
-  return &java::lang::String::class$
+  return &java::lang::String::class$;
 }
 
 inline vfy_jclass vfy_throwable_type (void)
 {
-  return &java::lang::Throwable::class$
+  return &java::lang::Throwable::class$;
 }
 
 inline vfy_jclass vfy_class_type (void)
 {
-  return &java::lang::Class::class$
+  return &java::lang::Class::class$;
 }
 
 __attribute__ ((__noreturn__))
-inline int vfy_fail (const char *message, int pc, vfy_jclass,
+inline int vfy_fail (const char *message, int pc, vfy_jclass current_class,
 		     vfy_method *method)
 {
   using namespace java::lang;
@@ -296,7 +352,7 @@
   if (pc != -1)
     {
       buf->append (JvNewStringLatin1 (" at PC "));
-      buf->append (pc);
+      buf->append (jint (pc));
     }
 
   buf->append (JvNewStringLatin1 (" in method "));
@@ -338,14 +394,11 @@
   return NULL;
 }
 
-// Return true if this method comes from a 1.5 class file.
-inline bool vfy_is_15 (vfy_method *method)
+inline void vfy_hand_off_flags (vfy_method *, unsigned char *flags)
 {
-  return false;			/* FIXME */
+  vfy_free (flags);
 }
 
-#define VFY_PRIMITIVE_CLASS(name) JvPrimClass (name)
-
 extern void _Jv_VerifyMethod (vfy_method *meth);
 
 #endif // JV_VERIFY_H
Index: libjava/java/lang/Class.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v
retrieving revision 1.75
diff -u -r1.75 Class.h
--- libjava/java/lang/Class.h 10 Jan 2005 19:39:25 -0000 1.75
+++ libjava/java/lang/Class.h 17 Apr 2005 20:55:57 -0000
@@ -65,6 +65,7 @@
 class _Jv_ExecutionEngine;
 class _Jv_CompiledEngine;
 class _Jv_InterpreterEngine;
+class _Jv_VerifyGlue;
 
 struct _Jv_Constants
 {
@@ -485,6 +486,7 @@
   friend class ::_Jv_ExecutionEngine;
   friend class ::_Jv_CompiledEngine;
   friend class ::_Jv_InterpreterEngine;
+  friend class ::_Jv_VerifyGlue;
 
   friend void ::_Jv_sharedlib_register_hook (jclass klass);
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]