2016-04-29 22 views
1

Wie würde ich diesen framenkode in Bytecode einfügen?FrameNode mit ASM einfügen

FRAME FULL [java/lang/String [C java/lang/String T I I [C] [] 

Mein erster Versuch war, dass:

mn.instructions.insertBefore(random, new FrameNode(Opcodes.F_FULL, 1 /**IDK**/, 
    new Object[]{ "java/lang/String", "[C", "java/lang/String", "T", "I", "I", "[C]" }, 
    1/**IDK**/, new Object[] { "[C]","[]" })); 

, die nicht gut funktionieren. Ausgabe:

FRAME FULL [[java/lang/String] [java/lang/String] 

Antwort

3

Ein Stapelrahmen besteht aus einer Anzahl von lokalen Variablen und einer Anzahl von Werten auf dem Operandenstapel. Was Sie versuchen, zu reproduzieren offenbar das Ergebnis der Umwandlung dieses Zustandes in einem für Menschen lesbaren String der Form

FRAME FULL [list of local variables types] [list of operand stack time types]

Das erste, was Sie tun müssen,

ist die Klammern von dem Ausgang zu identifizieren Format, das ein Verständnis der enthaltenen Typ-Signaturen erfordert, da eine Signatur beginnend mit einer öffnenden Klammer wie [C einen Array-Typ bezeichnet, dh ein Zeichen-Array. Mit anderen Worten, einige öffnende Klammern sind Teil der Typ-Signaturen, andere sind Teil des Ausgabeformats, während schließende Klammern immer Teil des Ausgabeformats sind und nie in Typ-Signaturen erscheinen.

Wenn Sie die Typsignaturen innerhalb der beiden Gruppen identifiziert haben, geben Sie die entsprechende Anzahl an lokalen Variablen und Operandenstapeln an. In Ihrem Fall haben Sie:

FRAME FULL // frame type 
[   // start local variables 
    java/lang/String 
    [C 
    java/lang/String 
    T 
    I 
    I 
    [C 
] // seven local variables specified 
[ // start of operand stack 
] // empty operand stack 

Aber dann müssen Sie der Art Artikels Gedanken über die Bedeutung beginnen, die von einer Druckausgabe leider nicht ableitbar ist und nur den gleichen Ausdruck Reproduktion nicht unbedingt richtig impliziert Code.

nämlich die Elemente T und I könnten Klassen verweisen die vollen qualifizierten Namen T und I mit jeweils, in welchem ​​Fall "T" und "I"-FrameNode vorbei wäre richtig. Es ist jedoch wahrscheinlicher, dass sie zu dem nicht-Klasse Stack-Frame-Typ und int beziehen, die unter Verwendung von vordefinierten Integer Konstanten in ASM bezeichnet werden muss:

new FrameNode(Opcodes.F_FULL, 7, new Object[] { 
    "java/lang/String", "[C", "java/lang/String", 
    Opcodes.TOP, Opcodes.INTEGER, Opcodes.INTEGER, "[C" }, 0, new Object[0]);