diff --git a/subprojects/core/src/main/java/org/gradle/groovy/scripts/internal/BuildScopeInMemoryCachingScriptClassCompiler.java b/subprojects/core/src/main/java/org/gradle/groovy/scripts/internal/BuildScopeInMemoryCachingScriptClassCompiler.java new file mode 100644 index 000000000000..437daf0d5d59 --- /dev/null +++ b/subprojects/core/src/main/java/org/gradle/groovy/scripts/internal/BuildScopeInMemoryCachingScriptClassCompiler.java @@ -0,0 +1,56 @@ +/* + * Copyright 2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.gradle.groovy.scripts.internal; + +import com.google.common.collect.Maps; +import groovy.lang.Script; +import org.codehaus.groovy.ast.ClassNode; +import org.gradle.api.Action; +import org.gradle.api.internal.initialization.loadercache.ClassLoaderId; +import org.gradle.groovy.scripts.ScriptSource; +import org.gradle.internal.Cast; + +import java.util.Map; + +/** + * This in-memory cache is responsible for caching compiled build scripts during a build. + * If the compiled script is not found in this cache, it will try to find it in the global cache, + * which will use the delegate script class compiler in case of a miss. The lookup in this cache is + * more efficient than looking in the global cache, as we do not check the script's hash code here, + * assuming that it did not change during the build. + */ +public class BuildScopeInMemoryCachingScriptClassCompiler implements ScriptClassCompiler { + private final CrossBuildInMemoryCachingScriptClassCache cache; + private final ScriptClassCompiler scriptClassCompiler; + private final Map> cachedCompiledScripts = Maps.newHashMap(); + + public BuildScopeInMemoryCachingScriptClassCompiler(CrossBuildInMemoryCachingScriptClassCache cache, ScriptClassCompiler scriptClassCompiler) { + this.cache = cache; + this.scriptClassCompiler = scriptClassCompiler; + } + + @Override + public CompiledScript compile(ScriptSource source, ClassLoader classLoader, ClassLoaderId classLoaderId, CompileOperation operation, Class scriptBaseClass, Action verifier) { + ScriptCacheKey key = new ScriptCacheKey(source.getClassName(), classLoader, operation.getId()); + CompiledScript compiledScript = Cast.uncheckedCast(cachedCompiledScripts.get(key)); + if (compiledScript == null) { + compiledScript = cache.getOrCompile(source, classLoader, classLoaderId, operation, scriptBaseClass, verifier, scriptClassCompiler); + cachedCompiledScripts.put(key, compiledScript); + } + return compiledScript; + } + +} diff --git a/subprojects/core/src/main/java/org/gradle/groovy/scripts/internal/BuildScopeScriptClassCompiler.java b/subprojects/core/src/main/java/org/gradle/groovy/scripts/internal/BuildScopeScriptClassCompiler.java deleted file mode 100644 index b81c18369106..000000000000 --- a/subprojects/core/src/main/java/org/gradle/groovy/scripts/internal/BuildScopeScriptClassCompiler.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2010 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.gradle.groovy.scripts.internal; - -import groovy.lang.Script; -import org.codehaus.groovy.ast.ClassNode; -import org.gradle.api.Action; -import org.gradle.api.internal.initialization.loadercache.ClassLoaderId; -import org.gradle.groovy.scripts.ScriptSource; - -/** - * ScriptClassCompiler that uses the cross-build in-memory cache and delegates to the given ScriptClassCompiler. - */ -public class BuildScopeScriptClassCompiler implements ScriptClassCompiler { - private final CrossBuildInMemoryCachingScriptClassCache cache; - private final ScriptClassCompiler scriptClassCompiler; - - public BuildScopeScriptClassCompiler(CrossBuildInMemoryCachingScriptClassCache cache, ScriptClassCompiler scriptClassCompiler) { - this.cache = cache; - this.scriptClassCompiler = scriptClassCompiler; - } - - @Override - public CompiledScript compile(ScriptSource source, ClassLoader classLoader, ClassLoaderId classLoaderId, CompileOperation operation, Class scriptBaseClass, Action verifier) { - return cache.getOrCompile(source, classLoader, classLoaderId, operation, scriptBaseClass, verifier, scriptClassCompiler); - } - -} diff --git a/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java b/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java index 83f733ae905f..0efcb81297c7 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java +++ b/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java @@ -97,7 +97,7 @@ import org.gradle.groovy.scripts.DefaultScriptCompilerFactory; import org.gradle.groovy.scripts.ScriptCompilerFactory; import org.gradle.groovy.scripts.ScriptExecutionListener; -import org.gradle.groovy.scripts.internal.BuildScopeScriptClassCompiler; +import org.gradle.groovy.scripts.internal.BuildScopeInMemoryCachingScriptClassCompiler; import org.gradle.groovy.scripts.internal.CrossBuildInMemoryCachingScriptClassCache; import org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler; import org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory; @@ -262,7 +262,7 @@ protected ScriptCompilerFactory createScriptCompileFactory(ListenerManager liste CrossBuildInMemoryCachingScriptClassCache cache) { ScriptExecutionListener scriptExecutionListener = listenerManager.getBroadcaster(ScriptExecutionListener.class); return new DefaultScriptCompilerFactory( - new BuildScopeScriptClassCompiler(cache, scriptCompiler), + new BuildScopeInMemoryCachingScriptClassCompiler(cache, scriptCompiler), new DefaultScriptRunnerFactory( scriptExecutionListener, DirectInstantiator.INSTANCE