Chocohead / Fabric-ASM

Just what Asie never wanted
Mozilla Public License 2.0
158 stars 19 forks source link

Java 17's sealed enums #11

Open modmuss50 opened 2 years ago

modmuss50 commented 2 years ago

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
hugeblank commented 10 months ago

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