Changeset 14015
- Timestamp:
- 07/23/12 11:58:34 (8 years ago)
- Location:
- trunk/abcl/src/org/armedbear/lisp
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/FaslClassLoader.java
r14002 r14015 60 60 */ 61 61 if (name.startsWith(baseName + "_")) { 62 String internalName = "org/armedbear/lisp/" + name; 62 String internalName = name.replace(".", "/"); 63 if (!internalName.contains("/")) internalName = "org/armedbear/lisp/" + internalName; 63 64 Class<?> c = this.findLoadedClass(internalName); 64 65 66 if (c == null && checkPreCompiledClassLoader) { 67 c = findPrecompiledClassOrNull(name); 68 // Oh, we have to return here so we don't become the owning class loader? 69 if (c != null) 70 return c; 71 } 65 72 if (c == null) { 66 73 c = findClass(name); … … 81 88 protected Class<?> findClass(String name) throws ClassNotFoundException { 82 89 try { 90 if (checkPreCompiledClassLoader) { 91 Class<?> c = findPrecompiledClassOrNull(name); 92 if (c != null) 93 return c; 94 } 83 95 byte[] b = getFunctionClassBytes(name); 84 return define Class(name, b, 0, b.length);96 return defineLispClass(name, b, 0, b.length); 85 97 } catch(Throwable e) { //TODO handle this better, readFunctionBytes uses Debug.assert() but should return null 86 98 e.printStackTrace(); … … 111 123 } 112 124 113 public byte[] getFunctionClassBytes(String name) {114 Pathname pathname = new Pathname(name.substring("org/armedbear/lisp/".length()) + "." + Lisp._COMPILE_FILE_CLASS_EXTENSION_.symbolValue().getStringValue());115 return readFunctionBytes(pathname);116 }117 118 public byte[] getFunctionClassBytes(Class<?> functionClass) {119 return getFunctionClassBytes(functionClass.getName());120 }121 122 public byte[] getFunctionClassBytes(Function f) {123 byte[] b = getFunctionClassBytes(f.getClass());124 f.setClassBytes(b);125 return b;126 }127 128 125 public LispObject loadFunction(int fnNumber) { 129 126 //Function name is fnIndex + 1 130 127 String name = baseName + "_" + (fnNumber + 1); 131 128 try { 132 Function f = (Function) loadClass(name).newInstance(); 133 f.setClassBytes(getFunctionClassBytes(name)); 129 Class clz = loadClass(name); 130 Function f = (Function) clz.newInstance(); 131 if (clz.getClassLoader() instanceof JavaClassLoader) { 132 // Don't do this for system classes (though probably dont need this for other classes) 133 f.setClassBytes(getFunctionClassBytes(name)); 134 } 134 135 return f; 135 136 } catch(Throwable e) { -
trunk/abcl/src/org/armedbear/lisp/JavaClassLoader.java
r13369 r14015 39 39 import java.util.HashSet; 40 40 import java.util.Set; 41 import java.io.DataInputStream; 42 import java.io.IOException; 43 import java.io.InputStream; 41 44 import java.net.URL; 42 45 import java.net.URLClassLoader; … … 46 49 private static JavaClassLoader persistentInstance; 47 50 51 public static boolean checkPreCompiledClassLoader = true; 52 53 public Class<?> loadClass(String name) throws ClassNotFoundException { 54 if (checkPreCompiledClassLoader) { 55 Class<?> c = findPrecompiledClassOrNull(name); 56 if (c != null) { 57 return c; 58 } 59 } 60 return loadClass(name, false); 61 } 62 63 /** 64 * Returns a class loaded by the system or bootstrap class loader; 65 * or return null if not found. 66 * 67 * On AOT systems like GCJ and IKVM this means a class implemented in ASM or CLR 68 * 69 * like findLoadedClass it does not throw an exception if a class is not found 70 */ 71 public Class<?> findPrecompiledClassOrNull(String name) { 72 ClassLoader ourCL = JavaClassLoader.class.getClassLoader(); 73 while (ourCL != null) { 74 try { 75 return Class.forName(name, true, ourCL); 76 } catch (ClassNotFoundException cnf) { 77 } 78 ourCL = ourCL.getParent(); 79 } 80 try { 81 return findSystemClass(name); 82 } catch (ClassNotFoundException e) { 83 return null; 84 } 85 } 86 87 public byte[] getFunctionClassBytes(String name) { 88 Pathname pathname 89 = new Pathname(name.substring("org/armedbear/lisp/".length()) 90 + "." + Lisp._COMPILE_FILE_CLASS_EXTENSION_.symbolValue().getStringValue()); 91 return readFunctionBytes(pathname); 92 } 93 94 public byte[] getFunctionClassBytes(Class<?> functionClass) { 95 String className = functionClass.getName(); 96 try { 97 String ext = Lisp._COMPILE_FILE_CLASS_EXTENSION_.symbolValue().getStringValue(); 98 InputStream is = getResourceAsStream(className.replace('.', '/') + "." + ext); 99 if (is != null) { 100 byte[] imgDataBa = new byte[(int) is.available()]; 101 DataInputStream dataIs = new DataInputStream(is); 102 dataIs.readFully(imgDataBa); 103 return imgDataBa; 104 } 105 } catch (IOException e) { 106 } 107 return getFunctionClassBytes(className); 108 } 109 110 final public byte[] getFunctionClassBytes(Function f) { 111 byte[] b = getFunctionClassBytes(f.getClass()); 112 f.setClassBytes(b); 113 return b; 114 } 115 48 116 private static Set<String> packages = Collections.synchronizedSet(new HashSet<String>()); 49 117 … … 54 122 55 123 public JavaClassLoader(ClassLoader parent) { 56 124 super(new URL[] {}, parent); 57 125 } 58 126 59 127 public JavaClassLoader(URL[] classpath, ClassLoader parent) { 60 128 super(classpath, parent); 61 129 } 62 130 … … 70 138 if (persistentInstance == null) 71 139 persistentInstance = new JavaClassLoader(); 72 140 definePackage(packageName); 73 141 return persistentInstance; 74 142 } … … 90 158 { 91 159 try { 92 long length = classbytes.length; 160 long length = classbytes.length; 93 161 if (length < Integer.MAX_VALUE) { 94 162 Class<?> c = 95 define Class(className, classbytes, 0, (int) length);163 defineLispClass(className, classbytes, 0, (int) length); 96 164 if (c != null) { 97 165 resolveClass(c); … … 100 168 } 101 169 } 102 170 catch (LinkageError e) { 103 171 throw e; 104 172 } 105 173 catch (Throwable t) { 106 174 Debug.trace(t); … … 109 177 } 110 178 179 protected final Class<?> defineLispClass(String name, byte[] b, int off, int len) 180 throws ClassFormatError { 181 ///if (checkPreCompiledClassLoader) Debug.trace("DEFINE JAVA CLASS " + name + " " + len); 182 return defineClass(name, b, off, len); 183 } 184 111 185 public Class<?> loadClassFromByteArray(String className, byte[] bytes, 112 186 int offset, int length) 113 187 { 114 188 try { 115 Class<?> c = define Class(className, bytes, offset, length);189 Class<?> c = defineLispClass(className, bytes, offset, length); 116 190 if (c != null) { 117 191 resolveClass(c); … … 131 205 @Override 132 206 public void addURL(URL url) { 133 207 super.addURL(url); 134 208 } 135 209 … … 138 212 private static final Primitive GET_DEFAULT_CLASSLOADER = new pf_get_default_classloader(); 139 213 private static final class pf_get_default_classloader extends Primitive { 140 141 214 215 private final LispObject defaultClassLoader = new JavaObject(new JavaClassLoader()); 142 216 143 217 pf_get_default_classloader() { … … 147 221 @Override 148 222 public LispObject execute() { 149 223 return defaultClassLoader; 150 224 } 151 225 }; … … 162 236 @Override 163 237 public LispObject execute() { 164 238 return new JavaObject(new JavaClassLoader(getCurrentClassLoader())); 165 239 } 166 240 167 241 @Override 168 242 public LispObject execute(LispObject parent) { 169 243 return new JavaObject(new JavaClassLoader((ClassLoader) parent.javaInstance(ClassLoader.class))); 170 244 } 171 245 }; … … 182 256 @Override 183 257 public LispObject execute() { 184 258 return execute(new JavaObject(getCurrentClassLoader())); 185 259 } 186 260 187 261 @Override 188 262 public LispObject execute(LispObject classloader) { 189 190 191 192 193 194 195 196 263 LispObject list = NIL; 264 Object o = classloader.javaInstance(); 265 while(o instanceof ClassLoader) { 266 ClassLoader cl = (ClassLoader) o; 267 list = list.push(dumpClassPath(cl)); 268 o = cl.getParent(); 269 } 270 return list.nreverse(); 197 271 } 198 272 }; … … 222 296 @Override 223 297 public LispObject execute(LispObject jarOrJars) { 224 298 return execute(jarOrJars, new JavaObject(getCurrentClassLoader())); 225 299 } 226 300 227 301 @Override 228 302 public LispObject execute(LispObject jarOrJars, LispObject classloader) { 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 303 Object o = classloader.javaInstance(); 304 if(o instanceof JavaClassLoader) { 305 JavaClassLoader jcl = (JavaClassLoader) o; 306 if(jarOrJars instanceof Cons) { 307 while(jarOrJars != NIL) { 308 addURL(jcl, jarOrJars.car()); 309 jarOrJars = jarOrJars.cdr(); 310 } 311 } else { 312 addURL(jcl, jarOrJars); 313 } 314 return T; 315 } else { 316 return error(new TypeError(o + " must be an instance of " + JavaClassLoader.class.getName())); 317 } 244 318 } 245 319 }; … … 257 331 258 332 public static LispObject dumpClassPath(ClassLoader o) { 259 260 261 262 263 264 265 266 267 333 if(o instanceof URLClassLoader) { 334 LispObject list = NIL; 335 for(URL u : ((URLClassLoader) o).getURLs()) { 336 list = list.push(new Pathname(u)); 337 } 338 return new Cons(new JavaObject(o), list.nreverse()); 339 } else { 340 return new JavaObject(o); 341 } 268 342 } 269 343 270 344 public static ClassLoader getCurrentClassLoader() { 271 272 273 274 275 276 345 LispObject classLoader = CLASSLOADER.symbolValueNoThrow(); 346 if(classLoader != null) { 347 return (ClassLoader) classLoader.javaInstance(ClassLoader.class); 348 } else { 349 return Lisp.class.getClassLoader(); 350 } 277 351 } 278 352 -
trunk/abcl/src/org/armedbear/lisp/MemoryClassLoader.java
r13710 r14015 79 79 } 80 80 } 81 82 if (checkPreCompiledClassLoader) { 83 Class<?> c = findPrecompiledClassOrNull(name); 84 if (c != null) { 85 return c; 86 } 87 } 81 88 82 89 // Fall through to our super's default handling … … 87 94 protected Class<?> findClass(String name) throws ClassNotFoundException { 88 95 try { 96 if (checkPreCompiledClassLoader) { 97 Class<?> c = findPrecompiledClassOrNull(name); 98 if (c != null) 99 return c; 100 } 89 101 byte[] b = getFunctionClassBytes(name); 90 return define Class(name, b, 0, b.length);102 return defineLispClass(name, b, 0, b.length); 91 103 } catch(Throwable e) { //TODO handle this better, readFunctionBytes uses Debug.assert() but should return null 92 104 e.printStackTrace(); … … 97 109 98 110 public byte[] getFunctionClassBytes(String name) { 99 return (byte[])hashtable.get(name).javaInstance(); 100 } 101 102 public byte[] getFunctionClassBytes(Class<?> functionClass) { 103 return getFunctionClassBytes(functionClass.getName()); 104 } 105 106 public byte[] getFunctionClassBytes(Function f) { 107 byte[] b = getFunctionClassBytes(f.getClass()); 108 f.setClassBytes(b); 109 return b; 111 if (hashtable.containsKey(name)) { 112 return (byte[])hashtable.get(name).javaInstance(); 113 } 114 return super.getFunctionClassBytes(name); 110 115 } 111 116 112 117 public LispObject loadFunction(String name) { 113 118 try { 114 Function f = (Function) loadClass(name).newInstance(); 115 f.setClassBytes(getFunctionClassBytes(name)); 119 Class clz = loadClass(name); 120 Function f = (Function) clz.newInstance(); 121 getFunctionClassBytes(f); //as a side effect it sets them 116 122 return f; 117 123 } catch(Throwable e) { … … 136 142 private static final Primitive PUT_MEMORY_FUNCTION = new pf_put_memory_function(); 137 143 private static final class pf_put_memory_function extends Primitive { 138 144 pf_put_memory_function() { 139 145 super("put-memory-function", PACKAGE_SYS, false, "loader class-name class-bytes"); 140 146 } … … 143 149 public LispObject execute(LispObject loader, LispObject className, LispObject classBytes) { 144 150 MemoryClassLoader l = (MemoryClassLoader) loader.javaInstance(MemoryClassLoader.class); 145 151 return (LispObject)l.hashtable.put(className.getStringValue(), (JavaObject)classBytes); 146 152 } 147 153 }; … … 149 155 private static final Primitive GET_MEMORY_FUNCTION = new pf_get_memory_function(); 150 156 private static final class pf_get_memory_function extends Primitive { 151 157 pf_get_memory_function() { 152 158 super("get-memory-function", PACKAGE_SYS, false, "loader class-name"); 153 159 } … … 156 162 public LispObject execute(LispObject loader, LispObject name) { 157 163 MemoryClassLoader l = (MemoryClassLoader) loader.javaInstance(MemoryClassLoader.class); 158 164 return l.loadFunction(name.getStringValue()); 159 165 } 160 166 }; 167 } 161 168 162 163 }
Note: See TracChangeset
for help on using the changeset viewer.