2014-02-22 3 views
0

일부는 (Minecraft Forge의 Transform 클래스를 사용하지만 관련이 없어야하는) 일부 asm으로 작업했지만, NoClassDefFoundError 및 NullPointerException으로 계속 충돌합니다. 나는 이미 문제와 이론적 인 해결책이 무엇인지를 좁혔다.Java ASM - AbstractInsnNode에서 LabelNode 가져 오기

피연산자 23에 코드를 삽입하려고하는데 코드에 이미 코드의 피연산자 68에있는 다른 레이블에 점프가 포함됩니다.

InsnList toInject = new InsnList(); 
toInject.add(new VarInsnNode(ALOAD, 0)); 
toInject.add(new InsnNode(ICONST_0)); 
toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "charAt", "(I)C")); 
toInject.add(new IntInsnNode(BIPUSH, 33)); 
toInject.add(new JumpInsnNode(IF_ICMPEQ, 68sLabelNode)); 
return toInject;   

마지막 추가는 내가 사용하려고했습니다 연산 68 에서 LabelNode의 레이블이 있어야합니다 :

m.instructions.insert(m.instructions.get(23), ConfigPatch1()); 

코드 주입 (m은 methodNode입니다)

(LabelNode) m.instructions.get(68) 

하지만 "스택에 나쁜 피연산자"오류가 발생합니다. 캐스트가 나빴다는 것을 나타내는 것처럼 보였다. get은 AbstractInsnNode를 반환합니다.

Operand 68에서 LabelNode를 가져 와서 사출시 사용할 수 있습니까?

감사합니다. StackOverflow!

답변

0

잘 모르겠습니다 만, 새로운 LabelNode를 작성하여 지시 # 68 바로 앞에 삽입 한 다음 바로 이동할 수 있다고 생각합니다.

또한 InstructionAdapter을 사용하는 것이 new 인 명령어를 직접 만드는 것보다 편리합니다.