2013-02-22 2 views
1

아마도 전체 메서드 본문이 처리되어 AbstractInsnNodes 묶음을 포함하는 InsnList과 비 바이트 코드 노드 (예 : FrameNode, LineNumberNode 등)로 변환됩니다. XXXNode 클래스의 javadoc는 일반적으로 몇 가지 유용한 정보가 포함되어 있습니다 (예를 들어,이 XXXNode에지도를 연산 코드하는)하지만 매핑이 총 될 것 같지 않습니다, 그래서 모든 경우에 일어나는 일에 대해 완전히 확실하지 않다 :ASM 4.0 Tree API : InsnNodes의 바이트 코드 매핑?

  • 무엇 WIDE 바이트 코드가 발생합니까? 다음 명령으로 자동으로 접 힙니 까? 아마도 그럴 것이지만 명시 적으로 그런 것을 찾을 수는 없습니다.
  • 모든 Ldc 명령어 (LDC, LDC_2, LDC_2W)는 모두 LdcInsnNodes에 매핑됩니까? 아마도 그들은 할 수 있지만 문서는 말하지 않습니다

일반적으로 Java 바이트 코드 -> ASM 클래스의 편리한 매핑이 있습니까? 자바 바이트 코드 시퀀스 (즉, 메서드 본문)에서 일부 처리를 수행하고 있으며 (내가 ~ 200 개 정도를 모두받을 수있는) 모든 바이트 코드가 올바르게 처리되고있는 ASM 데이터 구조에 매핑되는지 확인하려고합니다.

답변

1

예, LDC 지침 및 WIDE에 적합합니다. JVM이 연산 코드를 org.objectweb.asm.Opcodes 인터페이스의 Java-문서 (http://asm.ow2.org/asm40/javadoc/user/index.html)

public interface Opcodes

의 desciption에서 언급 한 정의로

ASM에서, API에 대한 액세스 플래그를 자바 바이트 코드의 옵 코드를 매핑하지 않고 배열 타입 코드. 이 인터페이스는 일부 opcode가 이 자동으로 처리되기 때문에 모든 JVM opcode를 정의하지 않습니다. 예를 들어, xLOAD 및 xSTORE opcode는 이며 가능한 경우 xLOAD_n 및 xSTORE_n opcode로 자동 교체됩니다. 따라서 xLOAD_n 및 xSTORE_n opcode는이 인터페이스에 정의되어 있지 않습니다. LDC와 마찬가지로 LDC_W 또는 LDC2_W (필요시 WIDE, GOTO_W 및 JSR_W)으로 자동 교체됩니다.

그리고 이것은 ASM의 다른 API로 변환됩니다.

은 여기를 확인할 수 있습니다 :

모두의

먼저 원래의 바이트 코드에서 정확한 일대일 매핑을 제공하지 않습니다 ASM을 유의하시기 바랍니다 ... -를 들어 http://osdir.com/ml/java.objectweb.asm/2008-03/msg00031.html

질문의 두 번째 부분은 자주 묻는 질문 (FAQ)에서 언급 한대로 ASMifer를 사용해 볼 수 있습니다 : http://asm.ow2.org/doc/faq.html#Q10. 기본적으로 ASM을 사용하여 호출해야하는 Java 명령어를 나열하여 일련의 ByteCode 명령어를 생성합니다.