Fabric-ASM icon indicating copy to clipboard operation
Fabric-ASM copied to clipboard

Java 17's sealed enums

Open modmuss50 opened this issue 3 years ago • 1 comments

The enum extender does not permit the new anonymous classes when the enum has been compiled with java 17. (All pre-existing classes are permited). I have seen a few people falling for this.

See: https://github.com/LordDeatHunter/HarvestScythes/issues/23

Example bytecode:

// class version 61.0 (61)
// access flags 0x4421
// signature Ljava/lang/Enum<Lnet/minecraft/enchantment/EnchantmentTarget;>;
// declaration: net/minecraft/enchantment/EnchantmentTarget extends java.lang.Enum<net.minecraft.enchantment.EnchantmentTarget>
public abstract enum net/minecraft/enchantment/EnchantmentTarget extends java/lang/Enum {

  // compiled from: EnchantmentTarget.java
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$6
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$5
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$4
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$3
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$2
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$14
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$13
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$12
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$11
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$10
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$9
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$8
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$7
  NESTMEMBER net/minecraft/enchantment/EnchantmentTarget$1
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$1
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$7
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$8
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$9
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$10
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$11
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$12
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$13
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$14
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$2
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$3
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$4
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$5
  PERMITTEDSUBCLASS net/minecraft/enchantment/EnchantmentTarget$6
  // access flags 0x4010
  final enum INNERCLASS net/minecraft/enchantment/EnchantmentTarget$1 null null
  // access flags 0x4010
  final enum INNERCLASS net/minecraft/enchantment/EnchantmentTarget$7 null null
  // access flags 0x4010
  final

modmuss50 avatar Dec 01 '21 23:12 modmuss50

Merging #23 will resolve this issue, but in the mean time this can be worked around using an access widener to make the enum extendable. You won't see any changes in the source, but it will remove the sealed modifier in the bytecode.

Taken from MattiDragon in a chat on Fabricord, and seemingly also discovered in BelgianSalamander/MoreBundles#12

hugeblank avatar Dec 16 '23 10:12 hugeblank