summaryrefslogtreecommitdiffstats
path: root/jack
diff options
context:
space:
mode:
authorBenoit Lamarche <benoitlamarche@google.com>2015-05-26 17:07:58 +0200
committerBenoit Lamarche <benoitlamarche@google.com>2015-05-29 12:03:08 +0200
commitedfcedaf3de656690374ae7c56e74235d406298b (patch)
treecbf964892836659fa4d96275bcef722291411140 /jack
parent074951b98dc7203f62ae76e894a19af38ed65725 (diff)
downloadtoolchain_jack-edfcedaf3de656690374ae7c56e74235d406298b.zip
toolchain_jack-edfcedaf3de656690374ae7c56e74235d406298b.tar.gz
toolchain_jack-edfcedaf3de656690374ae7c56e74235d406298b.tar.bz2
Always close the Jack output library
This change is required to make sure the Jack output library is closed, even when buildSession fails. It also makes sure that there is only one Jack output library instance. (cherry picked from commit 209c4fd6b447acceb73987f7df16c5bfbdf1ba0f) Change-Id: I16ed98ed34f6864ac518cac26d4157a35ae30e56
Diffstat (limited to 'jack')
-rw-r--r--jack/src/com/android/jack/Jack.java300
-rw-r--r--jack/src/com/android/jack/incremental/IncrementalInputFilter.java15
-rw-r--r--jack/src/com/android/jack/incremental/NoInputFilter.java7
-rw-r--r--jack/src/com/android/jack/ir/ast/JSession.java3
-rw-r--r--jack/tests/com/android/jack/frontend/OrderedInputFilter.java7
5 files changed, 179 insertions, 153 deletions
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index 0bf5664..cbc3d11 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -91,7 +91,6 @@ import com.android.jack.library.InputJackLibrary;
import com.android.jack.library.InputLibrary;
import com.android.jack.library.LibraryIOException;
import com.android.jack.library.LibraryReadingException;
-import com.android.jack.library.OutputLibrary;
import com.android.jack.lookup.CommonTypes;
import com.android.jack.lookup.JPhantomLookup;
import com.android.jack.meta.LibraryMetaWriter;
@@ -431,184 +430,187 @@ public abstract class Jack {
ConfigPrinterFactory.getConfigPrinter().printConfig(config);
- JSession session = buildSession(options, hooks);
+ JSession session = getSession();
- if (config.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) {
- session.setJackOutputLibrary(session.getInputFilter().getOutputJackLibrary());
- }
-
- Request request = createInitialRequest();
- request.addFeature(PreProcessor.class);
-
- request.addFeature(Resources.class);
+ try {
+ buildSession(session, options, hooks);
- JavaVersion sourceVersion = config.get(Options.JAVA_SOURCE_VERSION);
- if (sourceVersion.compareTo(JavaVersion.JAVA_7) >= 0) {
- request.addFeature(SourceVersion7.class);
- }
+ if (config.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) {
+ session.setJackOutputLibrary(session.getInputFilter().getOutputJackLibrary());
+ }
- if (config.get(Options.DROP_METHOD_BODY).booleanValue()) {
- request.addFeature(DropMethodBody.class);
- }
+ Request request = createInitialRequest();
+ request.addFeature(PreProcessor.class);
- if (config.get(Options.ENABLE_COMPILED_FILES_STATISTICS).booleanValue()) {
- request.addFeature(CompiledTypeStats.class);
- request.addFeature(CodeStats.class);
- }
+ request.addFeature(Resources.class);
- if (config.get(Options.SANITY_CHECKS).booleanValue()) {
- request.addFeature(SanityChecks.class);
- }
- if (config.get(PackageRenamer.JARJAR_ENABLED).booleanValue()) {
- request.addFeature(Jarjar.class);
- }
- if (config.get(VisibilityBridgeAdder.VISIBILITY_BRIDGE).booleanValue()) {
- request.addFeature(VisibilityBridge.class);
- }
- if (options.flags != null) {
- if (options.flags.shrink()) {
- request.addFeature(Shrinking.class);
- }
- if (options.flags.obfuscate()) {
- request.addFeature(Obfuscation.class);
- }
- if (options.flags.printSeeds()) {
- request.addProduction(SeedFile.class);
+ JavaVersion sourceVersion = config.get(Options.JAVA_SOURCE_VERSION);
+ if (sourceVersion.compareTo(JavaVersion.JAVA_7) >= 0) {
+ request.addFeature(SourceVersion7.class);
}
- if (!options.flags.keepAttribute("EnclosingMethod")) {
- request.addFeature(RemoveEnclosingMethod.class);
+
+ if (config.get(Options.DROP_METHOD_BODY).booleanValue()) {
+ request.addFeature(DropMethodBody.class);
}
- if (!options.flags.keepAttribute("InnerClasses")) {
- request.addFeature(RemoveEnclosingType.class);
+
+ if (config.get(Options.ENABLE_COMPILED_FILES_STATISTICS).booleanValue()) {
+ request.addFeature(CompiledTypeStats.class);
+ request.addFeature(CodeStats.class);
}
- if (!options.flags.keepAttribute("Signature")) {
- request.addFeature(RemoveGenericSignature.class);
+
+ if (config.get(Options.SANITY_CHECKS).booleanValue()) {
+ request.addFeature(SanityChecks.class);
}
- if (!options.flags.keepAttribute("AnnotationDefault")) {
- request.addFeature(RemoveAnnotationDefaultValue.class);
+ if (config.get(PackageRenamer.JARJAR_ENABLED).booleanValue()) {
+ request.addFeature(Jarjar.class);
}
- if (!options.flags.keepAttribute("LocalVariableTypeTable")) {
- request.addFeature(RemoveLocalVariableGenericSignature.class);
+ if (config.get(VisibilityBridgeAdder.VISIBILITY_BRIDGE).booleanValue()) {
+ request.addFeature(VisibilityBridge.class);
}
- if (!options.flags.keepAttribute("Exceptions")) {
- request.addFeature(RemoveThrownException.class);
+ if (options.flags != null) {
+ if (options.flags.shrink()) {
+ request.addFeature(Shrinking.class);
+ }
+ if (options.flags.obfuscate()) {
+ request.addFeature(Obfuscation.class);
+ }
+ if (options.flags.printSeeds()) {
+ request.addProduction(SeedFile.class);
+ }
+ if (!options.flags.keepAttribute("EnclosingMethod")) {
+ request.addFeature(RemoveEnclosingMethod.class);
+ }
+ if (!options.flags.keepAttribute("InnerClasses")) {
+ request.addFeature(RemoveEnclosingType.class);
+ }
+ if (!options.flags.keepAttribute("Signature")) {
+ request.addFeature(RemoveGenericSignature.class);
+ }
+ if (!options.flags.keepAttribute("AnnotationDefault")) {
+ request.addFeature(RemoveAnnotationDefaultValue.class);
+ }
+ if (!options.flags.keepAttribute("LocalVariableTypeTable")) {
+ request.addFeature(RemoveLocalVariableGenericSignature.class);
+ }
+ if (!options.flags.keepAttribute("Exceptions")) {
+ request.addFeature(RemoveThrownException.class);
+ }
+ if (!options.flags.keepAttribute("SourceFile")) {
+ request.addFeature(RemoveSourceFile.class);
+ }
+ if (!options.flags.keepAttribute("LineNumberTable")) {
+ request.addFeature(RemoveLineNumber.class);
+ }
+ if (!options.flags.getKeepParameterNames()) {
+ request.addFeature(RemoveParameterName.class);
+ }
+ if (options.flags.getRenameSourceFileAttribute() != null) {
+ request.addFeature(SourceFileRenaming.class);
+ }
+ if (options.flags.getAdaptResourceFileContents() != null) {
+ request.addFeature(AdaptResourceFileContent.class);
+ }
}
- if (!options.flags.keepAttribute("SourceFile")) {
- request.addFeature(RemoveSourceFile.class);
+ if (config.get(MappingPrinter.MAPPING_OUTPUT_ENABLED).booleanValue()) {
+ request.addProduction(Mapping.class);
}
- if (!options.flags.keepAttribute("LineNumberTable")) {
- request.addFeature(RemoveLineNumber.class);
+ if (config.get(ShrinkStructurePrinter.STRUCTURE_PRINTING).booleanValue()) {
+ request.addProduction(StructurePrinting.class);
}
- if (!options.flags.getKeepParameterNames()) {
- request.addFeature(RemoveParameterName.class);
+ if (config.get(MultiDexLegacy.MULTIDEX_LEGACY).booleanValue()) {
+ request.addFeature(MultiDexLegacy.class);
}
- if (options.flags.getRenameSourceFileAttribute() != null) {
- request.addFeature(SourceFileRenaming.class);
+ if (config.get(Options.INCREMENTAL_MODE).booleanValue()) {
+ request.addFeature(Incremental.class);
}
- if (options.flags.getAdaptResourceFileContents() != null) {
- request.addFeature(AdaptResourceFileContent.class);
+ if (config.get(Options.GENERATE_LIBRARY_FROM_INCREMENTAL_FOLDER).booleanValue()) {
+ request.addFeature(GenerateLibraryFromIncrementalFolder.class);
}
- }
- if (config.get(MappingPrinter.MAPPING_OUTPUT_ENABLED).booleanValue()) {
- request.addProduction(Mapping.class);
- }
- if (config.get(ShrinkStructurePrinter.STRUCTURE_PRINTING).booleanValue()) {
- request.addProduction(StructurePrinting.class);
- }
- if (config.get(MultiDexLegacy.MULTIDEX_LEGACY).booleanValue()) {
- request.addFeature(MultiDexLegacy.class);
- }
- if (config.get(Options.INCREMENTAL_MODE).booleanValue()) {
- request.addFeature(Incremental.class);
- }
- if (config.get(Options.GENERATE_LIBRARY_FROM_INCREMENTAL_FOLDER).booleanValue()) {
- request.addFeature(GenerateLibraryFromIncrementalFolder.class);
- }
-
- request.addInitialTagsOrMarkers(getJavaSourceInitialTagSet());
- request.addInitialTagsOrMarkers(getJackFormatInitialTagSet());
- if (config.get(Options.GENERATE_DEX_IN_LIBRARY).booleanValue()) {
- request.addProduction(DexInLibraryProduct.class);
- }
+ request.addInitialTagsOrMarkers(getJavaSourceInitialTagSet());
+ request.addInitialTagsOrMarkers(getJackFormatInitialTagSet());
- if (config.get(Options.GENERATE_DEX_FILE).booleanValue()) {
- request.addProduction(DexFileProduct.class);
- session.addGeneratedFileType(FileType.DEX);
- }
+ if (config.get(Options.GENERATE_DEX_IN_LIBRARY).booleanValue()) {
+ request.addProduction(DexInLibraryProduct.class);
+ }
- if (config.get(Options.GENERATE_JAYCE_IN_LIBRARY).booleanValue()) {
- request.addProduction(JayceInLibraryProduct.class);
- }
+ if (config.get(Options.GENERATE_DEX_FILE).booleanValue()) {
+ request.addProduction(DexFileProduct.class);
+ session.addGeneratedFileType(FileType.DEX);
+ }
- if (config.get(Options.GENERATE_DEPENDENCIES_IN_LIBRARY).booleanValue()) {
- request.addProduction(DependencyInLibraryProduct.class);
- }
+ if (config.get(Options.GENERATE_JAYCE_IN_LIBRARY).booleanValue()) {
+ request.addProduction(JayceInLibraryProduct.class);
+ }
- if (config.get(TypeDefRemover.REMOVE_TYPEDEF).booleanValue()) {
- request.addFeature(TypeDefRemover.RemoveTypeDef.class);
- }
+ if (config.get(Options.GENERATE_DEPENDENCIES_IN_LIBRARY).booleanValue()) {
+ request.addProduction(DependencyInLibraryProduct.class);
+ }
- ProductionSet targetProduction = request.getTargetProductions();
- FeatureSet features = request.getFeatures();
- PlanBuilder<JSession> planBuilder;
- try {
- planBuilder = request.getPlanBuilder(JSession.class);
- } catch (IllegalRequestException e) {
- throw new AssertionError(e);
- }
+ if (config.get(TypeDefRemover.REMOVE_TYPEDEF).booleanValue()) {
+ request.addFeature(TypeDefRemover.RemoveTypeDef.class);
+ }
- planBuilder.append(PreProcessorApplier.class);
+ ProductionSet targetProduction = request.getTargetProductions();
+ FeatureSet features = request.getFeatures();
+ PlanBuilder<JSession> planBuilder;
+ try {
+ planBuilder = request.getPlanBuilder(JSession.class);
+ } catch (IllegalRequestException e) {
+ throw new AssertionError(e);
+ }
- fillDexPlan(planBuilder);
- if (targetProduction.contains(DexFileProduct.class)) {
- planBuilder.append(DexFileWriter.class);
- }
+ planBuilder.append(PreProcessorApplier.class);
- if (features.contains(Resources.class)) {
+ fillDexPlan(planBuilder);
if (targetProduction.contains(DexFileProduct.class)) {
- planBuilder.append(ResourceWriter.class);
+ planBuilder.append(DexFileWriter.class);
}
- if (targetProduction.contains(JayceInLibraryProduct.class)) {
- planBuilder.append(LibraryResourceWriter.class);
+
+ if (features.contains(Resources.class)) {
+ if (targetProduction.contains(DexFileProduct.class)) {
+ planBuilder.append(ResourceWriter.class);
+ }
+ if (targetProduction.contains(JayceInLibraryProduct.class)) {
+ planBuilder.append(LibraryResourceWriter.class);
+ }
}
- }
- if (targetProduction.contains(JayceInLibraryProduct.class)) {
- planBuilder.append(LibraryMetaWriter.class);
- }
+ if (targetProduction.contains(JayceInLibraryProduct.class)) {
+ planBuilder.append(LibraryMetaWriter.class);
+ }
- Plan<JSession> plan;
- try {
- // Try to build an automatic plan ...
+ Plan<JSession> plan;
try {
- plan = request.buildPlan(JSession.class);
- } catch (PlanNotFoundException e) {
- throw new AssertionError(e);
- } catch (IllegalRequestException e) {
- throw new AssertionError(e);
+ // Try to build an automatic plan ...
+ try {
+ plan = request.buildPlan(JSession.class);
+ } catch (PlanNotFoundException e) {
+ throw new AssertionError(e);
+ } catch (IllegalRequestException e) {
+ throw new AssertionError(e);
+ }
+ } catch (UnsupportedOperationException e) {
+ // ... but use a manual one if not supported
+ plan = planBuilder.getPlan();
+
+ assert !targetProduction.contains(JayceInLibraryProduct.class)
+ || targetProduction.contains(DexFileProduct.class) || (plan.computeFinalTagsOrMarkers(
+ request.getInitialTags()).contains(JackFormatIr.class)
+ && !targetProduction.contains(DexInLibraryProduct.class)) || (
+ targetProduction.contains(DexInLibraryProduct.class)
+ && targetProduction.contains(JayceInLibraryProduct.class));
}
- } catch (UnsupportedOperationException e) {
- // ... but use a manual one if not supported
- plan = planBuilder.getPlan();
-
- assert !targetProduction.contains(JayceInLibraryProduct.class)
- || targetProduction.contains(DexFileProduct.class) || (plan.computeFinalTagsOrMarkers(
- request.getInitialTags()).contains(JackFormatIr.class)
- && !targetProduction.contains(DexInLibraryProduct.class)) || (
- targetProduction.contains(DexInLibraryProduct.class)
- && targetProduction.contains(JayceInLibraryProduct.class));
- }
- PlanPrinterFactory.getPlanPrinter().printPlan(plan);
- try {
+ PlanPrinterFactory.getPlanPrinter().printPlan(plan);
+
plan.getScheduleInstance().process(session);
} finally {
try {
- OutputLibrary jackOutputLibrary = session.getJackOutputLibrary();
- if (jackOutputLibrary != null) {
- jackOutputLibrary.close();
+ if (session.getInputFilter() != null) {
+ session.getInputFilter().getOutputJackLibrary().close();
}
+
// TODO(jack-team): auto-close
if (config.get(Options.GENERATE_DEX_FILE).booleanValue()
&& config.get(Options.DEX_OUTPUT_CONTAINER_TYPE) == Container.ZIP) {
@@ -656,11 +658,17 @@ public abstract class Jack {
}
@Nonnull
- static JSession buildSession(@Nonnull Options options, @Nonnull RunnableHooks hooks)
- throws JackUserException {
- Tracer tracer = TracerFactory.getTracer();
+ static JSession buildSession(@Nonnull Options options,
+ @Nonnull RunnableHooks hooks) throws JackUserException {
+ JSession session = getSession();
+ buildSession(session, options, hooks);
+ return session;
+ }
- JSession session = getSession();
+ @Nonnull
+ private static void buildSession(@Nonnull JSession session, @Nonnull Options options,
+ @Nonnull RunnableHooks hooks) throws JackUserException {
+ Tracer tracer = TracerFactory.getTracer();
session.setHooks(hooks);
@@ -762,8 +770,6 @@ public abstract class Jack {
MethodIdDuplicateRemover methodIdDupRemover = new MethodIdDuplicateRemover();
methodIdDupRemover.accept(session.getTypesToEmit());
}
-
- return session;
}
private static void addPackageLoaderForLibrary(JSession session,
diff --git a/jack/src/com/android/jack/incremental/IncrementalInputFilter.java b/jack/src/com/android/jack/incremental/IncrementalInputFilter.java
index 1330ada..98eb61c 100644
--- a/jack/src/com/android/jack/incremental/IncrementalInputFilter.java
+++ b/jack/src/com/android/jack/incremental/IncrementalInputFilter.java
@@ -153,6 +153,9 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter
@Nonnull
private final File incrementalFolder;
+ @Nonnull
+ private final OutputJackLibrary outputJackLibrary;
+
public IncrementalInputFilter(@Nonnull Options options) {
Config config = ThreadConfig.getConfig();
incrementalFolder = new File(config.get(Options.LIBRARY_OUTPUT_DIR).getPath());
@@ -196,6 +199,8 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter
session.getLibraryDependencies().addLibrariesOnClasspath(librariesOnClasspathFromCommandLine);
filesToRecompile = getInternalFileNamesToCompile();
+ outputJackLibrary = createOutputJackLibrary();
+
if (config.get(INCREMENTAL_LOG).booleanValue()) {
IncrementalLogWriter incLog;
try {
@@ -463,9 +468,9 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter
return inputLibraries;
}
- @Override
@Nonnull
- public OutputJackLibrary getOutputJackLibrary() {
+ private OutputJackLibrary createOutputJackLibrary() {
+
if (ThreadConfig.get(Options.GENERATE_LIBRARY_FROM_INCREMENTAL_FOLDER).booleanValue()) {
VFS dirVFS = ThreadConfig.get(Options.LIBRARY_OUTPUT_DIR);
ReadWriteZipFS zipVFS = (ReadWriteZipFS) ThreadConfig.get(Options.LIBRARY_OUTPUT_ZIP);
@@ -481,4 +486,10 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter
}
}
}
+
+ @Override
+ @Nonnull
+ public OutputJackLibrary getOutputJackLibrary() {
+ return outputJackLibrary;
+ }
}
diff --git a/jack/src/com/android/jack/incremental/NoInputFilter.java b/jack/src/com/android/jack/incremental/NoInputFilter.java
index 2dad78d..3813e89 100644
--- a/jack/src/com/android/jack/incremental/NoInputFilter.java
+++ b/jack/src/com/android/jack/incremental/NoInputFilter.java
@@ -50,6 +50,9 @@ public class NoInputFilter extends CommonFilter implements InputFilter {
@Nonnull
private final List<? extends InputLibrary> librariesOnClasspathFromCommandLine;
+ @Nonnull
+ private final OutputJackLibrary outputJackLibrary;
+
public NoInputFilter(@Nonnull Options options) {
this.options = options;
this.fileNamesToCompile = getJavaFileNamesSpecifiedOnCommandLine(options);
@@ -64,6 +67,8 @@ public class NoInputFilter extends CommonFilter implements InputFilter {
LibraryDependencies libraryDependencies = session.getLibraryDependencies();
libraryDependencies.addImportedLibraries(importedLibrariesFromCommandLine);
libraryDependencies.addLibrariesOnClasspath(librariesOnClasspathFromCommandLine);
+
+ outputJackLibrary = getOutputJackLibraryFromVfs();
}
@Override
@@ -87,6 +92,6 @@ public class NoInputFilter extends CommonFilter implements InputFilter {
@Override
@Nonnull
public OutputJackLibrary getOutputJackLibrary() {
- return getOutputJackLibraryFromVfs();
+ return outputJackLibrary;
}
}
diff --git a/jack/src/com/android/jack/ir/ast/JSession.java b/jack/src/com/android/jack/ir/ast/JSession.java
index a83ae03..ec72e2e 100644
--- a/jack/src/com/android/jack/ir/ast/JSession.java
+++ b/jack/src/com/android/jack/ir/ast/JSession.java
@@ -123,9 +123,8 @@ public class JSession extends JNode {
phantomLookup = new JPhantomLookup(lookup);
}
- @Nonnull
+ @CheckForNull
public InputFilter getInputFilter() {
- assert inputFilter != null;
return inputFilter;
}
diff --git a/jack/tests/com/android/jack/frontend/OrderedInputFilter.java b/jack/tests/com/android/jack/frontend/OrderedInputFilter.java
index 5d1be70..9b3ee59 100644
--- a/jack/tests/com/android/jack/frontend/OrderedInputFilter.java
+++ b/jack/tests/com/android/jack/frontend/OrderedInputFilter.java
@@ -56,6 +56,9 @@ public class OrderedInputFilter extends CommonFilter implements InputFilter {
@Nonnull
private final List<? extends InputLibrary> librariesOnClasspathFromCommandLine;
+ @Nonnull
+ private final OutputJackLibrary outputJackLibrary;
+
public OrderedInputFilter(@Nonnull Options options) {
this.options = options;
this.fileNamesToCompile = getJavaFileNamesSpecifiedOnCommandLine(options);
@@ -70,6 +73,8 @@ public class OrderedInputFilter extends CommonFilter implements InputFilter {
LibraryDependencies libraryDependencies = session.getLibraryDependencies();
libraryDependencies.addImportedLibraries(importedLibrariesFromCommandLine);
libraryDependencies.addLibrariesOnClasspath(librariesOnClasspathFromCommandLine);
+
+ outputJackLibrary = getOutputJackLibraryFromVfs();
}
@Override
@@ -93,7 +98,7 @@ public class OrderedInputFilter extends CommonFilter implements InputFilter {
@Override
@Nonnull
public OutputJackLibrary getOutputJackLibrary() {
- return getOutputJackLibraryFromVfs();
+ return outputJackLibrary;
}
@Override