Fix classloaders order on script evaluation

the dependencies one should be a parent for the modules one, to avoid
incompatibility problems. Also fixes main-kts tests
This commit is contained in:
Ilya Chernikov
2019-04-23 12:44:07 +02:00
parent 6ffc3a8679
commit 4b8d9c8fdd
@@ -104,11 +104,10 @@ fun KJvmCompiledScript<*>.getOrCreateActualClassloader(evaluationConfiguration:
val module = compiledModule val module = compiledModule
?: throw IllegalStateException("Illegal call sequence, actualClassloader should be set before calling function on the class without module") ?: throw IllegalStateException("Illegal call sequence, actualClassloader should be set before calling function on the class without module")
val baseClassLoader = evaluationConfiguration[ScriptEvaluationConfiguration.jvm.baseClassLoader] val baseClassLoader = evaluationConfiguration[ScriptEvaluationConfiguration.jvm.baseClassLoader]
val moduleClassLoader = module.createClassLoader(baseClassLoader)
val classLoaderWithDeps = val classLoaderWithDeps =
if (evaluationConfiguration[ScriptEvaluationConfiguration.jvm.loadDependencies] == false) moduleClassLoader if (evaluationConfiguration[ScriptEvaluationConfiguration.jvm.loadDependencies] == false) baseClassLoader
else makeClassLoaderFromDependencies(moduleClassLoader) else makeClassLoaderFromDependencies(baseClassLoader)
return classLoaderWithDeps return module.createClassLoader(classLoaderWithDeps)
} }
fun getConfigurationWithClassloader( fun getConfigurationWithClassloader(
@@ -130,7 +129,7 @@ fun getConfigurationWithClassloader(
} }
} }
private fun CompiledScript<*>.makeClassLoaderFromDependencies(baseClassLoader: ClassLoader): ClassLoader { private fun CompiledScript<*>.makeClassLoaderFromDependencies(baseClassLoader: ClassLoader?): ClassLoader? {
val processedScripts = mutableSetOf<CompiledScript<*>>() val processedScripts = mutableSetOf<CompiledScript<*>>()
fun seq(res: Sequence<CompiledScript<*>>, script: CompiledScript<*>): Sequence<CompiledScript<*>> { fun seq(res: Sequence<CompiledScript<*>>, script: CompiledScript<*>): Sequence<CompiledScript<*>> {
if (processedScripts.contains(script)) return res if (processedScripts.contains(script)) return res