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