Path: blob/main_old/third_party/bazel/desugar/stateful-lambdas.patch
1695 views
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassFixer.java b/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassFixer.java1index ff3e351996..f857e61d1e 1006442--- a/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassFixer.java3+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassFixer.java4@@ -93,7 +93,7 @@ class LambdaClassFixer extends ClassVisitor {5checkArgument(BitFlags.noneSet(access, Opcodes.ACC_INTERFACE), "Not a class: %s", name);6checkState(this.originalInternalName == null, "not intended for reuse but reused for %s", name);7originalInternalName = name;8- hasState = false;9+ hasState = true;10hasFactory = false;11desc = null;12this.signature = null;13@@ -136,7 +136,7 @@ class LambdaClassFixer extends ClassVisitor {14} else if ("<init>".equals(name)) {15this.desc = desc;16this.signature = signature;17- if (!lambdaInfo.needFactory() && !desc.startsWith("()")) {18+ if (!lambdaInfo.needFactory()) {19access &= ~Opcodes.ACC_PRIVATE; // make constructor accessible if we'll call it directly20}21}22@@ -156,10 +156,6 @@ class LambdaClassFixer extends ClassVisitor {2324@Override25public void visitEnd() {26- checkState(27- !hasState || hasFactory,28- "Expected factory method for capturing lambda %s",29- getInternalName());30if (!hasState) {31checkState(32signature == null,33diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java b/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java34index 8f90d25ff5..f5ed6d524a 10064435--- a/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java36+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaDesugaring.java37@@ -423,8 +423,7 @@ class LambdaDesugaring extends ClassVisitor {38String lambdaClassName = internalName + "$$Lambda$" + (lambdaCount++);39Type[] capturedTypes = Type.getArgumentTypes(desc);40boolean needFactory =41- capturedTypes.length != 042- && !attemptAllocationBeforeArgumentLoads(lambdaClassName, capturedTypes);43+ !attemptAllocationBeforeArgumentLoads(lambdaClassName, capturedTypes);44lambdas.generateLambdaClass(45internalName,46LambdaInfo.create(47@@ -435,7 +434,7 @@ class LambdaDesugaring extends ClassVisitor {48bridgeInfo.bridgeMethod()),49bsmMethod,50args);51- if (desc.startsWith("()")) {52+ if (false) {53// For stateless lambda classes we'll generate a singleton instance that we can just load54checkState(capturedTypes.length == 0);55super.visitFieldInsn(56@@ -493,7 +492,6 @@ class LambdaDesugaring extends ClassVisitor {57* @return {@code true} if we were able to insert a new/dup, {@code false} otherwise58*/59private boolean attemptAllocationBeforeArgumentLoads(String internalName, Type[] paramTypes) {60- checkArgument(paramTypes.length > 0, "Expected at least one param for %s", internalName);61// Walk backwards past loads corresponding to constructor arguments to find the instruction62// after which we need to insert our NEW/DUP pair63AbstractInsnNode insn = instructions.getLast();646566