Java/BCEL Несогласованная высота стека
Я работаю над своим заданием, в котором я должен изменить файл класса, используя BCEL для печати определенной информации, когда вызывается операция getfield.
Это включает в себя печать строки, если значение указанного поля больше 30.
У меня проблема с созданием условия if.
В настоящее время у меня есть
instructionList.append(InstructionFactory.createDup(type.getSize()));
instructionList.append(new PUSH(constantPoolGen, 30));
instructionList.append(new ISUB());
instructionList.append(new IFGT(instructionList.append(instructionFactory.createPrintln(" !this value is greater than 30!"))));
Первая строка дублирует значение, к которому обращается операция getfield.
Проблема в вызове IFGT(). После исполнения я получаю
Inconsistent stack height 2 != 3
Я попытался напечатать результат ISUB, и это, как и ожидалось, замена IFGT на POP заставляет программу работать должным образом, что заставляет меня поверить, что проблема заключается в последней строке.
Байт-код создан
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.io.IOException;
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello world
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: new #5; //class Test$myobject
11: dup
12: invokespecial #6; //Method Test$myobject."<init>":()V
15: astore_1
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: aload_1
20: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
23: ldc #69; //String Before getfield:\n Test$myobject\n char\n ftok
25: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
28: getfield #7; //Field Test$myobject.ftok:C
31: ldc #71; //String
33: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
36: dup_x1
37: pop
38: invokevirtual #75; //Method java/io/PrintStream.print:(Ljava/lang/Object;)V
41: dup
42: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
45: dup_x1
46: pop
47: invokevirtual #77; //Method java/io/PrintStream.print:(C)V
50: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
53: ldc #79; //String
55: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
58: invokevirtual #8; //Method java/io/PrintStream.println:(C)V
61: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
64: aload_1
65: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
68: ldc #81; //String Before getfield:\n Test$myobject\n int\n pok
70: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
73: getfield #9; //Field Test$myobject.pok:I
76: ldc #71; //String
78: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
81: dup_x1
82: pop
83: invokevirtual #75; //Method java/io/PrintStream.print:(Ljava/lang/Object;)V
86: dup
87: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
90: dup_x1
91: pop
92: invokevirtual #83; //Method java/io/PrintStream.print:(I)V
95: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
98: ldc #79; //String
100: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
103: dup
104: bipush 30
106: isub
107: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
110: ldc #85; //String !this value is greater than 30!
112: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
115: ifgt 107
118: invokevirtual #10; //Method java/io/PrintStream.println:(I)V
121: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
124: aload_1
125: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
128: ldc #87; //String Before getfield:\n Test$myobject\n int\n pyk
130: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
133: getfield #11; //Field Test$myobject.pyk:I
136: ldc #71; //String
138: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
141: dup_x1
142: pop
143: invokevirtual #75; //Method java/io/PrintStream.print:(Ljava/lang/Object;)V
146: dup
147: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
150: dup_x1
151: pop
152: invokevirtual #83; //Method java/io/PrintStream.print:(I)V
155: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
158: ldc #79; //String
160: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
163: dup
164: bipush 30
166: isub
167: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
170: ldc #85; //String !this value is greater than 30!
172: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
175: ifgt 167
178: invokevirtual #10; //Method java/io/PrintStream.println:(I)V
181: iconst_5
182: invokestatic #12; //Method returnint:(I)I
185: pop
186: ldc #13; //String plok
188: invokestatic #14; //Method returnstring:(Ljava/lang/String;)Ljava/lang/String;
191: pop
192: invokestatic #15; //Method nothing:()V
195: return
public static int returnint(int);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: iload_0
4: invokevirtual #10; //Method java/io/PrintStream.println:(I)V
7: iload_0
8: ireturn
public static java.lang.String returnstring(java.lang.String);
Code:
0: aload_0
1: areturn
public static void nothing();
Code:
0: return
}
Я пытался найти ответы, но, к сожалению, ничего не нашел.