From 616416569b6a27ec663ff093132acab2ce2dfe5a Mon Sep 17 00:00:00 2001 From: tterrag Date: Thu, 25 Apr 2019 19:51:20 -0400 Subject: [PATCH] Add explicit return type checks for extensible enums, fix exc --- .../common/asm/RuntimeEnumExtender.java | 15 +++++++++++++-- src/main/resources/forge.exc | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/fmllauncher/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java b/src/fmllauncher/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java index 6bebe03ca..fa4d62cc7 100644 --- a/src/fmllauncher/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java +++ b/src/fmllauncher/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java @@ -83,9 +83,9 @@ public class RuntimeEnumExtender implements ILaunchPluginService { return false; } - //Static methods named "create", with first argument as a string, and returning this type + //Static methods named "create" with first argument as a string List candidates = classNode.methods.stream() - .filter(m -> ((m.access & Opcodes.ACC_STATIC) != 0) && m.name.equals("create") && Type.getReturnType(m.desc).equals(classType)) + .filter(m -> ((m.access & Opcodes.ACC_STATIC) != 0) && m.name.equals("create")) .collect(Collectors.toList()); if (candidates.isEmpty()) { @@ -103,6 +103,17 @@ public class RuntimeEnumExtender implements ILaunchPluginService { })); throw new IllegalStateException("Enum has create method without String as first parameter: " + mtd.name + mtd.desc); } + + Type ret = Type.getReturnType(mtd.desc); + if (!ret.equals(classType)) { + LOGGER.fatal(()->new AdvancedLogMessageAdapter(sb-> { + sb.append("Enum has create method with incorrect return type:\n"); + sb.append(" Enum: " + classType.getDescriptor()).append("\n"); + sb.append(" Target: ").append(mtd.name + mtd.desc).append("\n"); + sb.append(" Found: ").append(ret.getClassName()).append(", Expected: ").append(classType.getClassName()); + })); + throw new IllegalStateException("Enum has create method with incorrect return type: " + mtd.name + mtd.desc); + } Type[] ctrArgs = new Type[args.length + 1]; ctrArgs[0] = STRING; diff --git a/src/main/resources/forge.exc b/src/main/resources/forge.exc index 789aac674..5bb3af307 100644 --- a/src/main/resources/forge.exc +++ b/src/main/resources/forge.exc @@ -28,7 +28,7 @@ net/minecraft/entity/player/EntityPlayer.getDigSpeed(Lnet/minecraft/block/state/ net/minecraft/entity/player/EntityPlayerMP.changeDimension(Lnet/minecraft/world/dimension/DimensionType;Lnet/minecraftforge/common/util/ITeleporter;)Lnet/minecraft/entity/Entity;=|p_212321_1_,teleporter net/minecraft/item/ArmorMaterial.create(Ljava/lang/String;Ljava/lang/String;I[IILnet/minecraft/util/SoundEvent;FLjava/util/function/Supplier;)Lnet/minecraft/item/ArmorMaterial;=|name,p_i48533_3_,p_i48533_4_,p_i48533_5_,p_i48533_6_,p_i48533_7_,p_i48533_8_,p_i48533_9_ -net/minecraft/item/EnumRarity.create(Ljava/lang/String;Lnet/minecraft/util/text/TextFormatting;)Lnet/minecraft/tileentity/BannerPattern;=|enumName,p_i48837_3_ +net/minecraft/item/EnumRarity.create(Ljava/lang/String;Lnet/minecraft/util/text/TextFormatting;)Lnet/minecraft/item/EnumRarity;=|enumName,p_i48837_3_ net/minecraft/item/ItemStack.(Lnet/minecraft/util/IItemProvider;ILnet/minecraft/nbt/NBTTagCompound;)V=|p_i48204_1_,p_i48204_2_,capNBT net/minecraft/network/PacketBuffer.writeItemStack(Lnet/minecraft/item/ItemStack;Z)Lnet/minecraft/network/PacketBuffer;=|p_150788_1_,limitedTag