firstNonNullClassLoader for jamvm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

GNU Classpath CVS needs a new VMClassLoader.firstNonNullClassLoader()
method. Here is a quick and dirty implementation (based on
getCallerFrame()) which works for me.

I have also installed this temporarily on builder.classpath.org to get
mauve results again. We will see how well it does soon :)

Cheers,

Mark
Index: lib/gnu/classpath/VMStackWalker.java
===================================================================
RCS file: /cvsroot/jamvm/jamvm/lib/gnu/classpath/VMStackWalker.java,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 VMStackWalker.java
--- lib/gnu/classpath/VMStackWalker.java	5 Sep 2005 00:02:35 -0000	1.1.1.1
+++ lib/gnu/classpath/VMStackWalker.java	20 Aug 2006 21:22:50 -0000
@@ -95,5 +95,11 @@
    * version of this method.
    */
   public static native ClassLoader getCallingClassLoader();
+
+  /**
+   * Walk up the stack and return the first non-null class loader.
+   * If there aren't any non-null class loaders on the stack, return null.
+   */
+  public static native ClassLoader firstNonNullClassLoader();
 }
 
Index: src/natives.c
===================================================================
RCS file: /cvsroot/jamvm/jamvm/src/natives.c,v
retrieving revision 1.17
diff -u -r1.17 natives.c
--- src/natives.c	28 Jun 2006 21:16:08 -0000	1.17
+++ src/natives.c	20 Aug 2006 21:22:50 -0000
@@ -548,6 +548,23 @@
     return ostack;
 }
 
+uintptr_t *firstNonNullClassLoader(Class *clazz, MethodBlock *mb, uintptr_t *ostack) {
+    uintptr_t *loader = NULL;
+    Frame *last = getExecEnv()->last_frame->prev;
+    Class *class;
+
+    while (loader == NULL) {
+        if((last->mb == NULL && (last = last->prev)->prev == NULL) ||
+             (last = getCallerFrame(last)) == NULL)
+            return NULL;
+        class = last->mb->class;
+        loader = class ? CLASS_CB(class)->class_loader : NULL;
+    }
+
+    *ostack++ = loader;
+    return ostack;
+}
+
 uintptr_t *getClassContext(Class *class, MethodBlock *mb, uintptr_t *ostack) {
     Class *class_class = findArrayClass("[Ljava/lang/Class;");
     Object *array;
@@ -1149,6 +1166,7 @@
     {"getClassContext",             getClassContext},
     {"getCallingClass",             getCallingClass},
     {"getCallingClassLoader",       getCallingClassLoader},
+    {"firstNonNullClassLoader",     firstNonNullClassLoader},
     {NULL,                          NULL}
 };
 

[Index of Archives]     [Linux Kernel]     [Linux Cryptography]     [Fedora]     [Fedora Directory]     [Red Hat Development]

  Powered by Linux