Guest User

Untitled

a guest
Jul 18th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. private static final Map<Character, Integer> TYPE_TO_RET =
  2. new HashMap<Character, Integer>();
  3.  
  4. static {
  5. TYPE_TO_RET.put('L', Opcodes.ARETURN);
  6. TYPE_TO_RET.put('[', Opcodes.ARETURN);
  7. TYPE_TO_RET.put('I', Opcodes.IRETURN);
  8. TYPE_TO_RET.put('Z', Opcodes.IRETURN);
  9. TYPE_TO_RET.put('B', Opcodes.IRETURN);
  10. TYPE_TO_RET.put('C', Opcodes.IRETURN);
  11. TYPE_TO_RET.put('S', Opcodes.IRETURN);
  12. TYPE_TO_RET.put('J', Opcodes.LRETURN);
  13. TYPE_TO_RET.put('F', Opcodes.FRETURN);
  14. TYPE_TO_RET.put('D', Opcodes.DRETURN);
  15. }
  16.  
  17. public void injectAccessor(ClassNode host, ClassNode fldOwner,
  18. FieldNode fld, String propName, String retType) {
  19. if (retType == null) {
  20. retType = fld.desc;
  21. }
  22. MethodNode accessor = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL,
  23. "get" + propName, "()" + retType, null, null);
  24. InsnList insns = new InsnList();
  25. boolean stateful = (fld.access & Opcodes.ACC_STATIC) == 0;
  26. if (stateful) {
  27. if (host == null) {
  28. host = fldOwner;
  29. }
  30. insns.add(new InsnNode(Opcodes.ALOAD_0));
  31. }
  32. insns.add(new FieldInsnNode(stateful ? Opcodes.GETFIELD : Opcodes.GETSTATIC,
  33. fldOwner.name, fld.name, fld.desc));
  34. insns.add(new InsnNode(TYPE_TO_RET.get(fld.desc.charAt(0))));
  35. accessor.instructions = insns;
  36. host.methods.add(accessor);
  37. }
  38.  
  39. /*
  40. * usage: injectAccessor(null, entity_kls, entity_hp_fld, "Hp", null)
  41. * injectAccessor(client_kls, game_state_owner, game_state_fld, "GameState", null);
  42. injectAccessor(client_kls, local_plyr_list_owner, local_plyr_list_fld, "LocalPlayerList", "[Lsupers/jewbot/Player;");
  43. */
Add Comment
Please, Sign In to add comment