Skip to content

Commit

Permalink
Merge pull request quarkusio#40033 from geoand/runner-cl-improvements
Browse files Browse the repository at this point in the history
Improve loading of classes in RunnerClassLoader
  • Loading branch information
geoand authored Apr 16, 2024
2 parents ce2e87f + 2710238 commit 82379e9
Showing 1 changed file with 48 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
*/
public final class RunnerClassLoader extends ClassLoader {

static {
registerAsParallelCapable();
}

/**
* A map of resources by dir name. Root dir/default package is represented by the empty string
*/
Expand Down Expand Up @@ -101,18 +105,55 @@ public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundExce
continue;
}
definePackage(packageName, resources);
try {
return defineClass(name, data, 0, data.length, resource.getProtectionDomain());
} catch (LinkageError e) {
loaded = findLoadedClass(name);
if (loaded != null) {
return loaded;
return defineClass(name, data, resource);
}
}
return getParent().loadClass(name);
}

private void definePackage(String pkgName, ClassLoadingResource[] resources) {
if ((pkgName != null) && getDefinedPackage(pkgName) == null) {
for (ClassLoadingResource classPathElement : resources) {
ManifestInfo mf = classPathElement.getManifestInfo();
if (mf != null) {
try {
definePackage(pkgName, mf.getSpecTitle(),
mf.getSpecVersion(),
mf.getSpecVendor(),
mf.getImplTitle(),
mf.getImplVersion(),
mf.getImplVendor(), null);
} catch (IllegalArgumentException e) {
var loaded = getDefinedPackage(pkgName);
if (loaded == null) {
throw e;
}
}
return;
}
}
try {
definePackage(pkgName, null, null, null, null, null, null, null);
} catch (IllegalArgumentException e) {
var loaded = getDefinedPackage(pkgName);
if (loaded == null) {
throw e;
}
}
}
return getParent().loadClass(name);
}

private Class<?> defineClass(String name, byte[] data, ClassLoadingResource resource) {
Class<?> loaded;
try {
return defineClass(name, data, 0, data.length, resource.getProtectionDomain());
} catch (LinkageError e) {
loaded = findLoadedClass(name);
if (loaded != null) {
return loaded;
}
throw e;
}
}

private void accessingResource(final ClassLoadingResource resource) {
Expand Down Expand Up @@ -219,28 +260,6 @@ protected Enumeration<URL> findResources(String name) {
return Collections.enumeration(urls);
}

private void definePackage(String pkgName, ClassLoadingResource[] resources) {
if ((pkgName != null) && getPackage(pkgName) == null) {
synchronized (getClassLoadingLock(pkgName)) {
if (getPackage(pkgName) == null) {
for (ClassLoadingResource classPathElement : resources) {
ManifestInfo mf = classPathElement.getManifestInfo();
if (mf != null) {
definePackage(pkgName, mf.getSpecTitle(),
mf.getSpecVersion(),
mf.getSpecVendor(),
mf.getImplTitle(),
mf.getImplVersion(),
mf.getImplVendor(), null);
return;
}
}
definePackage(pkgName, null, null, null, null, null, null, null);
}
}
}
}

private String getPackageNameFromClassName(String className) {
final int index = className.lastIndexOf('.');
if (index == -1) {
Expand Down

0 comments on commit 82379e9

Please sign in to comment.