Duplicate switch maps
Issue #263
resolved
ExtendJ 8.1.0-4-ge296850 Java SE 7
ExtendJ generates broken bytecode for this test:
// Test that multiple switch statements do not lead to duplicated switch map. // .result=EXEC_PASS public class Test { public static void main(String[] args) { test(Egg.TURKEY); test(Egg.TURTLE); test(Egg.FISH); } static void test(Egg egg) { System.out.format("%s egg weighs %dg and is %s%n", egg, weight(egg), color(egg)); } static String color(Egg egg) { switch (egg) { case TURKEY: return "White"; case TURTLE: return "green"; case FISH: return "orange"; } return "???"; } static int weight(Egg egg) { switch (egg) { case TURKEY: return 1000; case TURTLE: return 200; case FISH: return 2; } return -1; } } enum Egg { TURKEY, TURTLE, FISH, }
The issue is caused by duplicate implicit switch map fields generated in the class Test
.
Expected result: should execute without error
Actual result: runtime error:
[junit] [FAIL] runTest[enum/switch_02p](tests.extendj.TestJava7) [junit] Error output files differ expected:<[]> but was:<[Exception in thread "main" java.lang.ClassFormatError: Duplicate field name&signature in class file Test ...
Here is the relevant part of the bytecode:
static final int[] $SwitchMap$Egg; flags: ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC static final int[] $SwitchMap$Egg; flags: ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
Comments (2)
-
reporter -
reporter - changed status to resolved
Do not generate duplicate enum switch maps
This fixes an issue where duplicate implicit fields/methods were generated for enum switch maps.
To fix this, the enumIndices() attribute was moved from SwitchStmt to TypeDecl.
fixes
#263(bitbucket)→ <<cset 5c20689936d5>>
- Log in to comment
The switch map initializing method is also duplicated.