classpath-patches
[Top][All Lists]
Advanced

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

[cp-patches] FYI: VMStackWalker in CORBA.


From: Meskauskas Audrius
Subject: [cp-patches] FYI: VMStackWalker in CORBA.
Date: Thu, 13 Oct 2005 22:55:44 +0200
User-agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)

This patch looks for a classloader in the classes from the stack trace, making the functionality much closer to Sun's. The original idea was suggested by Jeroen Frijters, but I decided just to use VMStackWalker instead of modifying it.

2005-10-13  Audrius Meskauskas  <address@hidden>

* gnu/CORBA/ObjectCreator.java (forName):
Use gnu.classpath.VMStackWalker.
* gnu/CORBA/Interceptor/Registrator.java,
gnu/CORBA/gnuValueHolder.java,
gnu/CORBA/stubFinder.java,
gnu/javax/rmi/CORBA/DelegateFactory.java,
gnu/javax/rmi/CORBA/StubDelegateImpl.java,
org/omg/CORBA/ORB.java: Load class via ObjectCreator.
Index: gnu/CORBA/ObjectCreator.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/ObjectCreator.java,v
retrieving revision 1.8
diff -u -r1.8 ObjectCreator.java
--- gnu/CORBA/ObjectCreator.java        10 Oct 2005 22:49:50 -0000      1.8
+++ gnu/CORBA/ObjectCreator.java        13 Oct 2005 20:21:04 -0000
@@ -43,6 +43,7 @@
 import gnu.CORBA.CDR.cdrBufOutput;
 import gnu.CORBA.CDR.cdrInput;
 import gnu.CORBA.GIOP.ServiceContext;
+import gnu.classpath.VMStackWalker;
 
 import org.omg.CORBA.Any;
 import org.omg.CORBA.CompletionStatus;
@@ -547,12 +548,42 @@
   }
   
   /**
-   * Load the class with the given name.
+   * Load the class with the given name. This method tries to use the context
+   * class loader first. If this fails, it searches for the suitable class
+   * loader in the caller stack trace. This method is a central point where all
+   * requests to find a class by name are delegated.
    */
-  public static Class forName(String className)
-    throws ClassNotFoundException
-    {
-      return Class.forName(className, true, 
-        Thread.currentThread().getContextClassLoader());
-    }
+  public static Class forName(String className) throws ClassNotFoundException
+  {
+    try
+      {
+        return Class.forName(className, true,
+                             Thread.currentThread().getContextClassLoader());
+      }
+    catch (ClassNotFoundException nex)
+      {
+        /**
+         * Returns the first user defined class loader on the call stack, or
+         * null when no non-null class loader was found.
+         */
+        Class[] ctx = VMStackWalker.getClassContext();
+        for (int i = 0; i < ctx.length; i++)
+          {
+            // Since we live in a class loaded by the bootstrap
+            // class loader, getClassLoader is safe to call without
+            // needing to be wrapped in a privileged action.
+            ClassLoader cl = ctx[i].getClassLoader();
+            try
+              {
+                if (cl != null)
+                  return Class.forName(className, true, cl);
+              }
+            catch (ClassNotFoundException nex2)
+              {
+                // Try next.
+              }
+          }
+      }
+    throw new ClassNotFoundException(className);
+  }
 }
Index: gnu/CORBA/gnuValueHolder.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/gnuValueHolder.java,v
retrieving revision 1.2
diff -u -r1.2 gnuValueHolder.java
--- gnu/CORBA/gnuValueHolder.java       10 Oct 2005 22:49:50 -0000      1.2
+++ gnu/CORBA/gnuValueHolder.java       13 Oct 2005 18:30:02 -0000
@@ -123,8 +123,7 @@
     try
       {
         Class helperClass =
-          Class.forName(ObjectCreator.toHelperName(type.id()),
-            true, Thread.currentThread().getContextClassLoader());
+          ObjectCreator.forName(ObjectCreator.toHelperName(type.id()));
 
         helper = (BoxedValueHelper) helperClass.newInstance();
       }
Index: gnu/CORBA/stubFinder.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/stubFinder.java,v
retrieving revision 1.3
diff -u -r1.3 stubFinder.java
--- gnu/CORBA/stubFinder.java   10 Oct 2005 22:49:50 -0000      1.3
+++ gnu/CORBA/stubFinder.java   13 Oct 2005 18:58:20 -0000
@@ -83,8 +83,7 @@
 
         String stub = "_" + s.substring(b + 1) + "Stub";
 
-        Class stubClass = Class.forName(path + stub, true, 
-          Thread.currentThread().getContextClassLoader());
+        Class stubClass = ObjectCreator.forName(path + stub);
 
         return (ObjectImpl) stubClass.newInstance();
       }
Index: gnu/CORBA/Interceptor/Registrator.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/Interceptor/Registrator.java,v
retrieving revision 1.4
diff -u -r1.4 Registrator.java
--- gnu/CORBA/Interceptor/Registrator.java      10 Oct 2005 22:49:50 -0000      
1.4
+++ gnu/CORBA/Interceptor/Registrator.java      13 Oct 2005 18:31:08 -0000
@@ -39,6 +39,7 @@
 package gnu.CORBA.Interceptor;
 
 import gnu.CORBA.Poa.ORB_1_4;
+import gnu.CORBA.ObjectCreator;
 import gnu.CORBA.gnuCodecFactory;
 
 import org.omg.CORBA.BAD_INV_ORDER;
@@ -182,8 +183,8 @@
                 try
                   {
                     String cn = sk.substring(m_prefix.length());
-                    Class iClass = Class.forName(cn, true,
-                      Thread.currentThread().getContextClassLoader());
+                    Class iClass = ObjectCreator.forName(cn);
+                    
                     ORBInitializer initializer =
                       (ORBInitializer) iClass.newInstance();
                     m_initializers.add(initializer);
Index: gnu/javax/rmi/CORBA/DelegateFactory.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/javax/rmi/CORBA/DelegateFactory.java,v
retrieving revision 1.5
diff -u -r1.5 DelegateFactory.java
--- gnu/javax/rmi/CORBA/DelegateFactory.java    2 Oct 2005 19:58:01 -0000       
1.5
+++ gnu/javax/rmi/CORBA/DelegateFactory.java    13 Oct 2005 18:32:10 -0000
@@ -38,6 +38,8 @@
 
 package gnu.javax.rmi.CORBA;
 
+import gnu.CORBA.ObjectCreator;
+
 
 /**
  * This class produces delegates, using the system properties. If not
@@ -91,8 +93,7 @@
       }
     try
       {
-        Class dclass = Class.forName(dcname, true,
-          Thread.currentThread().getContextClassLoader());
+        Class dclass = ObjectCreator.forName(dcname);
         return dclass.newInstance();
       }
     catch (Exception e)
Index: gnu/javax/rmi/CORBA/StubDelegateImpl.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/javax/rmi/CORBA/StubDelegateImpl.java,v
retrieving revision 1.6
diff -u -r1.6 StubDelegateImpl.java
--- gnu/javax/rmi/CORBA/StubDelegateImpl.java   10 Oct 2005 22:49:50 -0000      
1.6
+++ gnu/javax/rmi/CORBA/StubDelegateImpl.java   13 Oct 2005 18:32:42 -0000
@@ -38,6 +38,7 @@
 
 package gnu.javax.rmi.CORBA;
 
+import gnu.CORBA.ObjectCreator;
 import gnu.CORBA.Unexpected;
 import gnu.CORBA.CDR.cdrBufInput;
 import gnu.CORBA.CDR.cdrBufOutput;
@@ -193,8 +194,7 @@
 
     try
       {
-        tieClass = Class.forName(tn, true, 
-          Thread.currentThread().getContextClassLoader());
+        tieClass = ObjectCreator.forName(tn);
         t = (Tie) tieClass.newInstance();
         if (self instanceof Remote)
           Util.registerTarget(t, (Remote) self);
Index: org/omg/CORBA/ORB.java
===================================================================
RCS file: /cvsroot/classpath/classpath/org/omg/CORBA/ORB.java,v
retrieving revision 1.17
diff -u -r1.17 ORB.java
--- org/omg/CORBA/ORB.java      10 Oct 2005 22:49:50 -0000      1.17
+++ org/omg/CORBA/ORB.java      13 Oct 2005 18:35:24 -0000
@@ -38,6 +38,7 @@
 
 package org.omg.CORBA;
 
+import gnu.CORBA.ObjectCreator;
 import gnu.CORBA.Restricted_ORB;
 import gnu.CORBA.fixedTypeCode;
 import gnu.CORBA.generalTypeCode;
@@ -1167,8 +1168,7 @@
 
     try
       {
-        orb = (ORB) Class.forName(orbClassName, true,
-          Thread.currentThread().getContextClassLoader()).newInstance();
+        orb = (ORB) ObjectCreator.forName(orbClassName).newInstance();
       }
     catch (ClassNotFoundException ex)
       {

reply via email to

[Prev in Thread] Current Thread [Next in Thread]