Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private static final Map<Character, Integer> TYPE_TO_RET =
- new HashMap<Character, Integer>();
- static {
- TYPE_TO_RET.put('L', Opcodes.ARETURN);
- TYPE_TO_RET.put('[', Opcodes.ARETURN);
- TYPE_TO_RET.put('I', Opcodes.IRETURN);
- TYPE_TO_RET.put('Z', Opcodes.IRETURN);
- TYPE_TO_RET.put('B', Opcodes.IRETURN);
- TYPE_TO_RET.put('C', Opcodes.IRETURN);
- TYPE_TO_RET.put('S', Opcodes.IRETURN);
- TYPE_TO_RET.put('J', Opcodes.LRETURN);
- TYPE_TO_RET.put('F', Opcodes.FRETURN);
- TYPE_TO_RET.put('D', Opcodes.DRETURN);
- }
- public void injectAccessor(ClassNode host, ClassNode fldOwner,
- FieldNode fld, String propName, String retType) {
- if (retType == null) {
- retType = fld.desc;
- }
- MethodNode accessor = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL,
- "get" + propName, "()" + retType, null, null);
- InsnList insns = new InsnList();
- boolean stateful = (fld.access & Opcodes.ACC_STATIC) == 0;
- if (stateful) {
- if (host == null) {
- host = fldOwner;
- }
- insns.add(new InsnNode(Opcodes.ALOAD_0));
- }
- insns.add(new FieldInsnNode(stateful ? Opcodes.GETFIELD : Opcodes.GETSTATIC,
- fldOwner.name, fld.name, fld.desc));
- insns.add(new InsnNode(TYPE_TO_RET.get(fld.desc.charAt(0))));
- accessor.instructions = insns;
- host.methods.add(accessor);
- }
- /*
- * usage: injectAccessor(null, entity_kls, entity_hp_fld, "Hp", null)
- * injectAccessor(client_kls, game_state_owner, game_state_fld, "GameState", null);
- injectAccessor(client_kls, local_plyr_list_owner, local_plyr_list_fld, "LocalPlayerList", "[Lsupers/jewbot/Player;");
- */
Add Comment
Please, Sign In to add comment