Remove stack slot calculation from RClassGenerator. The stack slot calculation is not needed because the COMPUTE_MAXS flag is set on the ClassWriter (passed values are ignored). PiperOrigin-RevId: 636244899 Change-Id: If51599c3cbec0ac95bdedbdac6b87a6472d81128
diff --git a/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializer.java b/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializer.java index 8bba422..b93aa0f 100644 --- a/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializer.java +++ b/src/tools/android/java/com/google/devtools/build/android/resources/FieldInitializer.java
@@ -30,12 +30,8 @@ */ boolean writeFieldDefinition(ClassWriter cw, boolean isFinal, boolean annotateTransitiveFields); - /** - * Write the bytecode for the clinit portion of initializer. - * - * @return the number of stack slots needed for the code. - */ - int writeCLInit(InstructionAdapter insts, String className); + /** Write the bytecode for the clinit portion of initializer. */ + void writeCLInit(InstructionAdapter insts, String className); /** Write the source code for the initializer to the given writer. */ void writeInitSource(Writer writer, boolean finalFields) throws IOException;
diff --git a/src/tools/android/java/com/google/devtools/build/android/resources/IntArrayFieldInitializer.java b/src/tools/android/java/com/google/devtools/build/android/resources/IntArrayFieldInitializer.java index 25994f9..8d88548 100644 --- a/src/tools/android/java/com/google/devtools/build/android/resources/IntArrayFieldInitializer.java +++ b/src/tools/android/java/com/google/devtools/build/android/resources/IntArrayFieldInitializer.java
@@ -231,7 +231,7 @@ } @Override - public int writeCLInit(InstructionAdapter insts, String className) { + public void writeCLInit(InstructionAdapter insts, String className) { insts.iconst(values.size()); insts.newarray(Type.INT_TYPE); int curIndex = 0; @@ -243,9 +243,6 @@ ++curIndex; } insts.putstatic(className, fieldName, DESC); - // Needs up to 4 stack slots for: the array ref for the putstatic, the dup of the array ref - // for the store, the index, and the value to store. - return 4; } @Override
diff --git a/src/tools/android/java/com/google/devtools/build/android/resources/IntFieldInitializer.java b/src/tools/android/java/com/google/devtools/build/android/resources/IntFieldInitializer.java index b6a5fe3..68fb180 100644 --- a/src/tools/android/java/com/google/devtools/build/android/resources/IntFieldInitializer.java +++ b/src/tools/android/java/com/google/devtools/build/android/resources/IntFieldInitializer.java
@@ -81,11 +81,9 @@ } @Override - public int writeCLInit(InstructionAdapter insts, String className) { + public void writeCLInit(InstructionAdapter insts, String className) { insts.iconst(value); insts.putstatic(className, fieldName, DESC); - // Just needs one stack slot for the iconst. - return 1; } @Override
diff --git a/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java b/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java index bb9e5ea..2410fa2 100644 --- a/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java +++ b/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java
@@ -13,7 +13,6 @@ // limitations under the License. package com.google.devtools.build.android.resources; -import static java.lang.Math.max; import static java.nio.file.StandardOpenOption.CREATE_NEW; import com.android.SdkConstants; @@ -226,7 +225,8 @@ constructor.visitVarInsn(Opcodes.ALOAD, 0); constructor.visitMethodInsn(Opcodes.INVOKESPECIAL, SUPER_CLASS, "<init>", "()V", false); constructor.visitInsn(Opcodes.RETURN); - constructor.visitMaxs(1, 1); + // Values are ignored because COMPUTE_MAXS is set above, but call still required. + constructor.visitMaxs(0, 0); constructor.visitEnd(); } @@ -244,7 +244,6 @@ ListIterator<FieldInitializer> iterator = deferredInitializers.listIterator(); while (iterator.hasNext()) { int currentMethodSize = 0; - int stackSlotsNeeded = 0; // This first time around the method name is <clinit> and after that, the method name is // created in the previous iteration. MethodVisitor visitor = @@ -267,7 +266,7 @@ iterator.previous(); break; } - stackSlotsNeeded = max(stackSlotsNeeded, fieldInit.writeCLInit(insts, className)); + fieldInit.writeCLInit(insts, className); currentMethodSize += fieldInit.getMaxBytecodeSize(); } if (iterator.hasNext()) { @@ -278,7 +277,8 @@ accessFlags = Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC; } insts.areturn(Type.VOID_TYPE); - visitor.visitMaxs(stackSlotsNeeded, 0); + // Values are ignored because COMPUTE_MAXS is set above, but call still required. + visitor.visitMaxs(0, 0); visitor.visitEnd(); } }