From 991256bfd32db22de9b475ef5e5d05ab2ffb39d7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 22 Apr 2013 18:40:29 +0400 Subject: [PATCH] Use preloader in the IDE --- .idea/artifacts/KotlinPlugin.xml | 1 + ide-compiler-runner/ide-compiler-runner.iml | 1 + .../compiler/runner/CompilerRunnerUtil.java | 30 +++++++++++++++---- .../compiler/runner/KotlinCompilerRunner.java | 3 +- .../jet/plugin/compiler/K2JSCompiler.java | 3 +- 5 files changed, 30 insertions(+), 8 deletions(-) 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);