Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java 17's sealed enums #11

Open
modmuss50 opened this issue Dec 1, 2021 · 1 comment
Open

Java 17's sealed enums #11

modmuss50 opened this issue Dec 1, 2021 · 1 comment

Comments

@modmuss50
Copy link

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: LordDeatHunter/HarvestScythes#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
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants