tterrag1098

Untitled

May 15th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. package com.enderio.core.common.transform;
  2.  
  3. import static org.objectweb.asm.Opcodes.ACC_ABSTRACT;
  4.  
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import java.util.stream.Collectors;
  8.  
  9. import org.apache.logging.log4j.LogManager;
  10. import org.apache.logging.log4j.Logger;
  11. import org.objectweb.asm.ClassReader;
  12. import org.objectweb.asm.ClassWriter;
  13. import org.objectweb.asm.tree.ClassNode;
  14.  
  15. import com.enderio.core.common.transform.EnderCorePlugin.InterfacePatchData;
  16.  
  17. import net.minecraft.launchwrapper.IClassTransformer;
  18.  
  19. public class InterfacePatcher implements IClassTransformer {
  20.  
  21. public static final Logger logger = LogManager.getLogger();
  22.  
  23. private final EnderCorePlugin plugin = EnderCorePlugin.instance();
  24.  
  25. private final Map<String, byte[]> capturedSources = new HashMap<>();
  26.  
  27. @Override
  28. public byte[] transform(String name, String transformedName, byte[] targetClass) {
  29. InterfacePatchData data = null;
  30. for (InterfacePatchData d : plugin.ifacePatches) {
  31. if (d.target.equals(transformedName)) {
  32. data = d;
  33. break;
  34. }
  35. if (d.source.equals(transformedName)) {
  36. capturedSources.put(transformedName, targetClass);
  37. break;
  38. }
  39. }
  40. if (data != null) {
  41. byte[] sourceClass = capturedSources.get(data.source);
  42. if (sourceClass == null) {
  43. logger.error("[EnderCore ASM] Skipping interface patch due to unloaded class: " + data.source);
  44. } else {
  45. ClassNode targetNode = new ClassNode();
  46. ClassReader targetReader = new ClassReader(targetClass);
  47. targetReader.accept(targetNode, 0);
  48.  
  49. ClassNode sourceNode = new ClassNode();
  50. ClassReader sourceReader = new ClassReader(sourceClass);
  51. sourceReader.accept(sourceNode, 0);
  52.  
  53. targetNode.interfaces.addAll(sourceNode.interfaces);
  54. targetNode.methods.addAll(sourceNode.methods.stream()
  55. .filter(m -> !m.name.equals("<init>"))
  56. .filter(m -> (m.access & ACC_ABSTRACT) == 0)
  57. .collect(Collectors.toList()));
  58.  
  59. ClassWriter cw = new ClassWriter(0);
  60. targetNode.accept(cw);
  61. logger.info("Patched interfaces from {} onto {}.", data.source, data.target);
  62. return cw.toByteArray();
  63. }
  64. }
  65. return targetClass;
  66. }
  67.  
  68. }
Advertisement
Add Comment
Please, Sign In to add comment