New stack trace code

Andrew Haley aph@redhat.com
Thu Mar 17 15:19:00 GMT 2005


A few more bug fixes.

1.  source_file_name wasn't being marked for GC.

2.  VMSecurityManager.getClassContext() assumed it was always being
    called by SecurityManager.  This isn't true: it is also called by
    ClassLoader and Package.  This causes the search to run off the
    end of the stack.

3.  _Jv_StackTrace::GetClassContext() calculates the size of the
    context array incorrectly.  This leads to some very weird
    instances of memory corruption.

It's probably better to rewrite ClassLoader.getParent and
Package.getPackage to use _Jv_StackTrace::GetCallingClass() instead of
VMSecurityManager.getClassContext(), but that's a matter of
efficiency: this patch at least brings JOnAS back to life.

Andrew.



2005-03-17  Andrew Haley  <aph@redhat.com>

	* java/lang/natVMSecurityManager.cc (getClassContext): Add new
	arg: klass.
	Pass klass to _Jv_StackTrace::GetClassContext().
	* java/lang/ClassLoader.java (getParent): Pass class to
	VMSecurityManager.getClassContext()
	(getSystemClassLoader): Likewise.
	* java/lang/Package.java (getPackage): Likewise.
	(getPackages): Likewise.
	* java/lang/SecurityManager.java (getClassContext): Likewise.
	(currentClassLoader): Likewise.
	* java/lang/VMSecurityManager.java: (getClassContext): Likewise.
	(currentClassLoader) Add new arg: caller.
	Pass caller to VMSecurityManager.getClassContext.

	* stacktrace.cc (GetClassContext): Correct calculation of
	jframe_count.

	* boehm.cc (_Jv_MarkObj): (_Jv_MarkObj): Mark
	im->source_file_name.

Index: boehm.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/boehm.cc,v
retrieving revision 1.46
diff -p -2 -c -r1.46 boehm.cc
*** boehm.cc	17 Mar 2005 02:53:21 -0000	1.46
--- boehm.cc	17 Mar 2005 13:47:21 -0000
*************** _Jv_MarkObj (void *addr, void *msp, void
*** 249,252 ****
--- 249,255 ----
  	  MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, ic);
  
+ 	  p = (GC_PTR) ic->source_file_name;
+ 	  MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, ic);
+ 
  	  for (int i = 0; i < c->method_count; i++)
  	    {
Index: stacktrace.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/stacktrace.cc,v
retrieving revision 1.3
diff -p -2 -c -r1.3 stacktrace.cc
*** stacktrace.cc	16 Mar 2005 18:18:58 -0000	1.3
--- stacktrace.cc	17 Mar 2005 13:47:21 -0000
*************** _Jv_StackTrace::GetClassContext (jclass 
*** 465,481 ****
        FillInFrameInfo (frame);
        
!       if (seen_checkClass
!           && frame->klass
! 	  && frame->klass != checkClass)
  	{
!           jframe_count++;
! 	  if (start_pos == -1)
! 	    start_pos = i;
  	}
! 
!       if (!seen_checkClass
!           && frame->klass
!           && frame->klass == checkClass)
!         seen_checkClass = true;
      }
    result = (JArray<jclass> *) _Jv_NewObjectArray (jframe_count, &Class::class$, NULL);
--- 465,479 ----
        FillInFrameInfo (frame);
        
!       if (seen_checkClass)
  	{
! 	  if (frame->klass)
! 	    {
! 	      jframe_count++;
! 	      if (start_pos == -1)
! 		start_pos = i;
! 	    }
  	}
!       else
! 	seen_checkClass = frame->klass == checkClass;
      }
    result = (JArray<jclass> *) _Jv_NewObjectArray (jframe_count, &Class::class$, NULL);
Index: java/lang/ClassLoader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/ClassLoader.java,v
retrieving revision 1.38
diff -p -2 -c -r1.38 ClassLoader.java
*** java/lang/ClassLoader.java	17 Feb 2005 07:48:33 -0000	1.38
--- java/lang/ClassLoader.java	17 Mar 2005 13:47:23 -0000
*************** public abstract class ClassLoader
*** 487,491 ****
      if (sm != null)
        {
!         Class c = VMSecurityManager.getClassContext()[1];
          ClassLoader cl = c.getClassLoader();
  	if (cl != null && ! cl.isAncestorOf(this))
--- 487,491 ----
      if (sm != null)
        {
!         Class c = VMSecurityManager.getClassContext(ClassLoader.class)[1];
          ClassLoader cl = c.getClassLoader();
  	if (cl != null && ! cl.isAncestorOf(this))
*************** public abstract class ClassLoader
*** 730,734 ****
      if (sm != null)
        {
! 	Class c = VMSecurityManager.getClassContext()[1];
  	ClassLoader cl = c.getClassLoader();
  	if (cl != null && cl != systemClassLoader)
--- 730,734 ----
      if (sm != null)
        {
! 	Class c = VMSecurityManager.getClassContext(ClassLoader.class)[1];
  	ClassLoader cl = c.getClassLoader();
  	if (cl != null && cl != systemClassLoader)
Index: java/lang/Package.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Package.java,v
retrieving revision 1.10
diff -p -2 -c -r1.10 Package.java
*** java/lang/Package.java	10 Jan 2005 19:39:26 -0000	1.10
--- java/lang/Package.java	17 Mar 2005 13:47:23 -0000
*************** public class Package
*** 274,278 ****
    {
      // Get the caller's classloader
!     ClassLoader cl = VMSecurityManager.currentClassLoader();
      return cl != null ? cl.getPackage(name) : VMClassLoader.getPackage(name);
    }
--- 274,278 ----
    {
      // Get the caller's classloader
!     ClassLoader cl = VMSecurityManager.currentClassLoader(Package.class);
      return cl != null ? cl.getPackage(name) : VMClassLoader.getPackage(name);
    }
*************** public class Package
*** 287,291 ****
    {
      // Get the caller's classloader
!     Class c = VMSecurityManager.getClassContext()[1];
      ClassLoader cl = c.getClassLoader();
      return cl != null ? cl.getPackages() : VMClassLoader.getPackages();
--- 287,291 ----
    {
      // Get the caller's classloader
!     Class c = VMSecurityManager.getClassContext(Package.class)[1];
      ClassLoader cl = c.getClassLoader();
      return cl != null ? cl.getPackages() : VMClassLoader.getPackages();
Index: java/lang/SecurityManager.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/SecurityManager.java,v
retrieving revision 1.13
diff -p -2 -c -r1.13 SecurityManager.java
*** java/lang/SecurityManager.java	17 Feb 2005 07:48:33 -0000	1.13
--- java/lang/SecurityManager.java	17 Mar 2005 13:47:23 -0000
*************** public class SecurityManager
*** 168,172 ****
    protected Class[] getClassContext()
    {
!     return VMSecurityManager.getClassContext();
    }
  
--- 168,172 ----
    protected Class[] getClassContext()
    {
!     return VMSecurityManager.getClassContext(SecurityManager.class);
    }
  
*************** public class SecurityManager
*** 190,194 ****
    protected ClassLoader currentClassLoader()
    {
!     return VMSecurityManager.currentClassLoader();
    }
  
--- 190,194 ----
    protected ClassLoader currentClassLoader()
    {
!     return VMSecurityManager.currentClassLoader(SecurityManager.class);
    }
  
Index: java/lang/VMSecurityManager.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/VMSecurityManager.java,v
retrieving revision 1.3
diff -p -2 -c -r1.3 VMSecurityManager.java
*** java/lang/VMSecurityManager.java	25 Nov 2004 03:47:04 -0000	1.3
--- java/lang/VMSecurityManager.java	17 Mar 2005 13:47:23 -0000
*************** class VMSecurityManager
*** 44,48 ****
     **         on the Java execution stack.
     **/
!   static native Class[] getClassContext();
  
    /** Get the current ClassLoader--the one nearest to the
--- 44,48 ----
     **         on the Java execution stack.
     **/
!   static native Class[] getClassContext(Class caller);
  
    /** Get the current ClassLoader--the one nearest to the
*************** class VMSecurityManager
*** 50,54 ****
     ** @return the current ClassLoader.
     **/
!   static ClassLoader currentClassLoader()
    {
      // The docs above are wrong.  See the online docs.
--- 50,54 ----
     ** @return the current ClassLoader.
     **/
!   static ClassLoader currentClassLoader(Class caller)
    {
      // The docs above are wrong.  See the online docs.
*************** class VMSecurityManager
*** 56,60 ****
      // must also consider ancestors of the system class loader.
      ClassLoader systemClassLoader = VMClassLoader.getSystemClassLoader();
!     Class[] classStack = getClassContext ();
      for (int i = 0; i < classStack.length; i++)
        {
--- 56,60 ----
      // must also consider ancestors of the system class loader.
      ClassLoader systemClassLoader = VMClassLoader.getSystemClassLoader();
!     Class[] classStack = getClassContext (caller);
      for (int i = 0; i < classStack.length; i++)
        {
Index: java/lang/natVMSecurityManager.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natVMSecurityManager.cc,v
retrieving revision 1.4
diff -p -2 -c -r1.4 natVMSecurityManager.cc
*** java/lang/natVMSecurityManager.cc	10 Mar 2005 19:02:20 -0000	1.4
--- java/lang/natVMSecurityManager.cc	17 Mar 2005 13:47:23 -0000
*************** details.  */
*** 21,28 ****
  
  JArray<jclass> *
! java::lang::VMSecurityManager::getClassContext ()
  {
    JArray<jclass> *result = 
!     _Jv_StackTrace::GetClassContext (&SecurityManager::class$);
  
    return result;
--- 21,28 ----
  
  JArray<jclass> *
! java::lang::VMSecurityManager::getClassContext (jclass klass)
  {
    JArray<jclass> *result = 
!     _Jv_StackTrace::GetClassContext (klass);
  
    return result;



More information about the Java-patches mailing list