Skip to content

Commit

Permalink
Support loading classes from an explicit JAR.
Browse files Browse the repository at this point in the history
  • Loading branch information
jnthn committed Aug 6, 2013
1 parent 1c9a894 commit c9a07ec
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/BootJavaInterop.java
@@ -1,12 +1,16 @@
package org.perl6.nqp.runtime;

import java.io.File;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
Expand Down Expand Up @@ -41,10 +45,14 @@ public class BootJavaInterop {

/** The global context that this interop factory is used for. */
protected GlobalContext gc;

/** If we need to load stuff from a JAR, the class loader for doing so. */
private HashMap<String, URLClassLoader> jarClassLoaders;

/** Create a new interop object for a context. */
public BootJavaInterop(GlobalContext gc) {
this.gc = gc;
this.jarClassLoaders = new HashMap<String, URLClassLoader>();
}

private static class InteropInfo {
Expand Down Expand Up @@ -92,6 +100,24 @@ public SixModelObject typeForName(String name) {
throw ExceptionHandling.dieInternal(gc.getCurrentThreadContext(), e);
}
}
public SixModelObject typeForNameFromJAR(String name, String JAR) {
try {
URLClassLoader cl = jarClassLoaders.get(JAR);
if (cl == null) {
URL url = new URL("jar:" + new File(JAR).toURI().toURL() + "!/");
cl = new URLClassLoader(new URL[] { url });
jarClassLoaders.put(JAR, cl);
}
return getSTableForClass(Class.forName(name, true, cl)).WHAT;
} catch (ClassNotFoundException e) {
throw ExceptionHandling.dieInternal(gc.getCurrentThreadContext(), e);
} catch (MalformedURLException e) {
throw ExceptionHandling.dieInternal(gc.getCurrentThreadContext(), e);
} catch (Throwable e) {
e.printStackTrace();
throw e;
}
}

/** Convenience methods for NQP coding. */
public GlobalContext currentGC() {
Expand Down

0 comments on commit c9a07ec

Please sign in to comment.