diff --git a/.idea/artifacts/KotlinPlugin.xml b/.idea/artifacts/KotlinPlugin.xml
index c21183dae2c..d070d3e2400 100644
--- a/.idea/artifacts/KotlinPlugin.xml
+++ b/.idea/artifacts/KotlinPlugin.xml
@@ -32,6 +32,7 @@
+
diff --git a/ide-compiler-runner/ide-compiler-runner.iml b/ide-compiler-runner/ide-compiler-runner.iml
index 4707ed53d80..6b04cf366d7 100644
--- a/ide-compiler-runner/ide-compiler-runner.iml
+++ b/ide-compiler-runner/ide-compiler-runner.iml
@@ -10,6 +10,7 @@
+
diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/CompilerRunnerUtil.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/CompilerRunnerUtil.java
index bff91dc1e6d..e37c7bca203 100644
--- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/CompilerRunnerUtil.java
+++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/CompilerRunnerUtil.java
@@ -19,6 +19,7 @@ package org.jetbrains.jet.compiler.runner;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.cli.common.messages.*;
+import org.jetbrains.jet.preloading.ClassPreloadingUtils;
import org.jetbrains.jet.utils.KotlinPaths;
import java.io.*;
@@ -35,7 +36,7 @@ import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.*;
public class CompilerRunnerUtil {
- private static SoftReference ourClassLoaderRef = new SoftReference(null);
+ private static SoftReference ourClassLoaderRef = new SoftReference(null);
public static List kompilerClasspath(KotlinPaths paths, MessageCollector messageCollector) {
File libs = paths.getLibPath();
@@ -50,11 +51,26 @@ public class CompilerRunnerUtil {
return answer;
}
- public static URLClassLoader getOrCreateClassLoader(KotlinPaths paths, MessageCollector messageCollector) {
- URLClassLoader answer = ourClassLoaderRef.get();
+ public static ClassLoader getOrCreatePreloader(KotlinPaths paths, MessageCollector messageCollector) {
+ ClassLoader answer = ourClassLoaderRef.get();
+ if (answer == null) {
+ try {
+ int estimatedClassNumber = 4096;
+ answer = ClassPreloadingUtils.preloadClasses(kompilerClasspath(paths, messageCollector), estimatedClassNumber, null);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ ourClassLoaderRef = new SoftReference(answer);
+ }
+ return answer;
+ }
+
+ public static ClassLoader getOrCreateClassLoader(KotlinPaths paths, MessageCollector messageCollector) {
+ ClassLoader answer = ourClassLoaderRef.get();
if (answer == null) {
answer = createClassloader(paths, messageCollector);
- ourClassLoaderRef = new SoftReference(answer);
+ ourClassLoaderRef = new SoftReference(answer);
}
return answer;
}
@@ -90,9 +106,11 @@ public class CompilerRunnerUtil {
public static Object invokeExecMethod(
String className, String[] arguments, CompilerEnvironment environment,
- MessageCollector messageCollector, PrintStream out
+ MessageCollector messageCollector, PrintStream out, boolean usePreloader
) throws Exception {
- URLClassLoader loader = getOrCreateClassLoader(environment.getKotlinPaths(), messageCollector);
+ ClassLoader loader = usePreloader
+ ? getOrCreatePreloader(environment.getKotlinPaths(), messageCollector)
+ : getOrCreateClassLoader(environment.getKotlinPaths(), messageCollector);
Class> kompiler = Class.forName(className, true, loader);
Method exec = kompiler.getMethod("exec", PrintStream.class, String[].class);
return exec.invoke(kompiler.newInstance(), out, arguments);
diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java
index e9afc3f6de3..7737a7fac94 100644
--- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java
+++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java
@@ -74,7 +74,8 @@ public class KotlinCompilerRunner {
messageCollector.report(CompilerMessageSeverity.INFO,
"Invoking in-process compiler " + compilerClassName + " with arguments " + Arrays.asList(arguments),
CompilerMessageLocation.NO_LOCATION);
- Object rc = CompilerRunnerUtil.invokeExecMethod(compilerClassName, arguments, environment, messageCollector, out);
+ Object rc = CompilerRunnerUtil.invokeExecMethod(compilerClassName, arguments, environment,
+ messageCollector, out, /*usePreloader=*/true);
// exec() returns a K2JVMCompiler.ExitCode object, that class is not accessible here,
// so we take it's contents through reflection
return CompilerRunnerUtil.getReturnCodeFromObject(rc);
diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java
index 5be4ece9d5a..6cdecbeeff2 100644
--- a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java
+++ b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java
@@ -129,7 +129,8 @@ public final class K2JSCompiler implements TranslatingCompiler {
File outDir = environment.getOutput();
File outFile = new File(outDir, module.getName() + ".js");
String[] commandLineArgs = constructArguments(module, outFile);
- Object rc = invokeExecMethod("org.jetbrains.jet.cli.js.K2JSCompiler", commandLineArgs, environment, messageCollector, out);
+ // No preloading for in-process compiler
+ Object rc = invokeExecMethod("org.jetbrains.jet.cli.js.K2JSCompiler", commandLineArgs, environment, messageCollector, out, false);
if (!ApplicationManager.getApplication().isUnitTestMode()) {
VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(outDir);