Skip to content

Commit

Permalink
Restore build scope script class cache
Browse files Browse the repository at this point in the history
This cache was useful when a script was applied
multiple times during a build. It avoids checking
the hash of the script again, as we can safely
assume that a build script will not change during
a single build.
  • Loading branch information
oehme committed Feb 4, 2018
1 parent f1dc54d commit 37007e1
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 43 deletions.
@@ -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<ScriptCacheKey, CompiledScript<?, ?>> cachedCompiledScripts = Maps.newHashMap();

This comment has been minimized.

Copy link
@fkorotkov

fkorotkov Feb 9, 2018

@oehme should it be a Maps.newConcurrentMap()? Can it be accessed concurrently?

This comment has been minimized.

Copy link
@oehme

oehme Feb 9, 2018

Author Contributor

It wasn't before so I think it's safe, but I'll check.


public BuildScopeInMemoryCachingScriptClassCompiler(CrossBuildInMemoryCachingScriptClassCache cache, ScriptClassCompiler scriptClassCompiler) {
this.cache = cache;
this.scriptClassCompiler = scriptClassCompiler;
}

@Override
public <T extends Script, M> CompiledScript<T, M> compile(ScriptSource source, ClassLoader classLoader, ClassLoaderId classLoaderId, CompileOperation<M> operation, Class<T> scriptBaseClass, Action<? super ClassNode> verifier) {
ScriptCacheKey key = new ScriptCacheKey(source.getClassName(), classLoader, operation.getId());
CompiledScript<T, M> 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;
}

}

This file was deleted.

Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 37007e1

Please sign in to comment.