diff options
author | Googler <noreply@google.com> | 2017-02-24 22:49:46 +0000 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-03-13 17:20:08 -0700 |
commit | d3371d01485317d82c584e39838f6cf565076a68 (patch) | |
tree | 9fb9f34fe4930756102833fd52cca0437e3a258e /java/com/google/devtools/build/android/desugar/LambdaDesugaring.java | |
parent | 90d5d5ca6672380b7a5ede3c240b2676b226818f (diff) | |
download | desugar-d3371d01485317d82c584e39838f6cf565076a68.tar.gz |
More stable naming scheme for lambda classes in desugared android code
RELNOTES: More stable naming scheme for lambda classes in desugared android code
--
PiperOrigin-RevId: 148506830
MOS_MIGRATED_REVID=148506830
GitOrigin-RevId: 0dcdb06fb5dce3425209de9bb66fc76e34279fb7
Change-Id: If747055f69903ddb5fd1bbd33c732f7342c9c064
Diffstat (limited to 'java/com/google/devtools/build/android/desugar/LambdaDesugaring.java')
-rw-r--r-- | java/com/google/devtools/build/android/desugar/LambdaDesugaring.java | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java b/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java index 79be2a3..a3cf3bf 100644 --- a/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java +++ b/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java @@ -55,6 +55,7 @@ class LambdaDesugaring extends ClassVisitor { private String internalName; private boolean isInterface; + private int lambdaCount; public LambdaDesugaring( ClassVisitor dest, @@ -77,6 +78,7 @@ class LambdaDesugaring extends ClassVisitor { String signature, String superName, String[] interfaces) { + checkState(internalName == null, "not intended for reuse but reused for %s", name); internalName = name; isInterface = BitFlags.isSet(access, Opcodes.ACC_INTERFACE); super.visit(version, access, name, signature, superName, interfaces); @@ -360,9 +362,13 @@ class LambdaDesugaring extends ClassVisitor { // and ultimately we don't care if the bootstrap method was even on the bootclasspath // when this class was compiled (although it must've been since javac is unhappy otherwise). MethodHandle bsmMethod = toMethodHandle(publicLookup(), bsm, /*target*/ false); - String lambdaClassName = lambdas.generateLambdaClass( + // Give generated classes to have more stable names (b/35643761). Use BSM's naming scheme + // but with separate counter for each surrounding class. + String lambdaClassName = internalName + "$$Lambda$" + (lambdaCount++); + lambdas.generateLambdaClass( internalName, - LambdaInfo.create(desc, bridgeInfo.methodReference(), bridgeInfo.bridgeMethod()), + LambdaInfo.create( + lambdaClassName, desc, bridgeInfo.methodReference(), bridgeInfo.bridgeMethod()), bsmMethod, args); // Emit invokestatic that calls the factory method generated in the lambda class |