Use preloader in the IDE

This commit is contained in:
Andrey Breslav
2013-04-22 18:40:29 +04:00
parent ddb474ea8e
commit 991256bfd3
5 changed files with 30 additions and 8 deletions
+1
View File
@@ -32,6 +32,7 @@
<element id="module-output" name="ide-compiler-runner" />
<element id="module-output" name="cli-common" />
<element id="module-output" name="util" />
<element id="module-output" name="preloader" />
</element>
</element>
</element>
@@ -10,6 +10,7 @@
<orderEntry type="library" name="idea-full" level="project" />
<orderEntry type="module" module-name="cli-common" />
<orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="preloader" />
</component>
</module>
@@ -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<URLClassLoader> ourClassLoaderRef = new SoftReference<URLClassLoader>(null);
private static SoftReference<ClassLoader> ourClassLoaderRef = new SoftReference<ClassLoader>(null);
public static List<File> 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<ClassLoader>(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<URLClassLoader>(answer);
ourClassLoaderRef = new SoftReference<ClassLoader>(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);
@@ -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);
@@ -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);