diff options
author | cnsun <cnsun@google.com> | 2017-11-14 14:03:09 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-11-29 11:28:27 -0800 |
commit | f0971e886d2142be6219bb4a0ffa03f26b02f110 (patch) | |
tree | 31ba0cfa1fa639cda488ce1c736f15e652b38443 /java/com/google/devtools/build/android/desugar/Desugar.java | |
parent | 8daf1cc87a760edfda738e11be41d61776b4e630 (diff) | |
download | desugar-f0971e886d2142be6219bb4a0ffa03f26b02f110.tar.gz |
Specialize $closeResource(Throwable, AutoCloseable) so that desugared code does not depend on AutoCloseable, as it is not available before API 19.
This CL includes the following:
1. A type inference algorithm based on ASM. It relies on the stack map frames to compute type information at the entry of basic blocks.
2. The type inference is used to infer the types of the resources to be closed. Then for each concrete resource type, we specialize the synthetic $closeResource method to $closeResource(Throwable, <concrete resource type>).
RELNOTES: None
PiperOrigin-RevId: 175731437
GitOrigin-RevId: e83f3b1fb010298cbe1e16e5f7f2f39bfb045cef
Change-Id: I347f8e4058a191621fb21bf2e81d7cf8f39ce6aa
Diffstat (limited to 'java/com/google/devtools/build/android/desugar/Desugar.java')
-rw-r--r-- | java/com/google/devtools/build/android/desugar/Desugar.java | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/java/com/google/devtools/build/android/desugar/Desugar.java b/java/com/google/devtools/build/android/desugar/Desugar.java index 2b02386..5d3df4a 100644 --- a/java/com/google/devtools/build/android/desugar/Desugar.java +++ b/java/com/google/devtools/build/android/desugar/Desugar.java @@ -408,8 +408,7 @@ class Desugar { "com.google.devtools.build.android.desugar.dependencies.MetadataCollector") .getConstructor(Boolean.TYPE) .newInstance(options.tolerateMissingDependencies); - } catch (ReflectiveOperationException - | SecurityException e) { + } catch (ReflectiveOperationException | SecurityException e) { throw new IllegalStateException("Can't emit desugaring metadata as requested"); } } else if (options.tolerateMissingDependencies) { @@ -530,7 +529,8 @@ class Desugar { interfaceLambdaMethods, bridgeMethodReader, lambdaClass.getValue(), - writer); + writer, + reader); reader.accept(visitor, 0); String filename = rewriter.unprefix(lambdaClass.getValue().desiredInternalName()) + ".class"; @@ -573,12 +573,19 @@ class Desugar { ImmutableSet<String> interfaceLambdaMethods, @Nullable ClassReaderFactory bridgeMethodReader, LambdaInfo lambdaClass, - UnprefixingClassWriter writer) { + UnprefixingClassWriter writer, + ClassReader input) { ClassVisitor visitor = checkNotNull(writer); if (!allowTryWithResources) { + CloseResourceMethodScanner closeResourceMethodScanner = new CloseResourceMethodScanner(); + input.accept(closeResourceMethodScanner, ClassReader.SKIP_DEBUG); visitor = new TryWithResourcesRewriter( - visitor, loader, visitedExceptionTypes, numOfTryWithResourcesInvoked); + visitor, + loader, + visitedExceptionTypes, + numOfTryWithResourcesInvoked, + closeResourceMethodScanner.hasCloseResourceMethod()); } if (!allowCallsToObjectsNonNull) { // Not sure whether there will be implicit null check emitted by javac, so we rerun @@ -638,9 +645,15 @@ class Desugar { ClassReader input) { ClassVisitor visitor = checkNotNull(writer); if (!allowTryWithResources) { + CloseResourceMethodScanner closeResourceMethodScanner = new CloseResourceMethodScanner(); + input.accept(closeResourceMethodScanner, ClassReader.SKIP_DEBUG); visitor = new TryWithResourcesRewriter( - visitor, loader, visitedExceptionTypes, numOfTryWithResourcesInvoked); + visitor, + loader, + visitedExceptionTypes, + numOfTryWithResourcesInvoked, + closeResourceMethodScanner.hasCloseResourceMethod()); } if (!allowCallsToObjectsNonNull) { visitor = new ObjectsRequireNonNullMethodRewriter(visitor); |