1
+ const ILOAD_1 : u8 = 27 ;
1
2
const ALOAD_0 : u8 = 42 ;
3
+ const IRETURN : u8 = 172 ;
2
4
const RETURN : u8 = 177 ;
5
+ const GETFIELD : u8 = 180 ;
6
+ const PUTFIELD : u8 = 181 ;
3
7
const INVOKESPECIAL : u8 = 183 ;
4
8
5
9
#[ derive( Debug ) ]
6
10
pub enum Bytecode {
11
+ Iload_1 ,
7
12
Aload_0 ,
13
+ Ireturn ,
8
14
Return ,
15
+ Getfield ( u16 ) ,
16
+ Putfield ( u16 ) ,
9
17
Invokespecial ( u16 ) ,
10
18
}
11
19
@@ -20,16 +28,44 @@ impl Bytecode {
20
28
let instruction = bytes[ i] ;
21
29
22
30
match instruction {
31
+ ILOAD_1 => {
32
+ bytecode. push ( ( i, Iload_1 ) ) ;
33
+
34
+ i += 1 ;
35
+ } ,
23
36
ALOAD_0 => {
24
37
bytecode. push ( ( i, Aload_0 ) ) ;
25
38
26
39
i += 1 ;
27
40
} ,
41
+ IRETURN => {
42
+ bytecode. push ( ( i, Ireturn ) ) ;
43
+
44
+ i += 1 ;
45
+ } ,
28
46
RETURN => {
29
47
bytecode. push ( ( i, Return ) ) ;
30
48
31
49
i += 1 ;
32
50
} ,
51
+ GETFIELD => {
52
+ let field = u16:: from_be_bytes (
53
+ [ bytes[ i + 1 ] , bytes[ i + 2 ] ]
54
+ ) ;
55
+
56
+ bytecode. push ( ( i, Getfield ( field) ) ) ;
57
+
58
+ i += 3 ;
59
+ } ,
60
+ PUTFIELD => {
61
+ let field = u16:: from_be_bytes (
62
+ [ bytes[ i + 1 ] , bytes[ i + 2 ] ]
63
+ ) ;
64
+
65
+ bytecode. push ( ( i, Putfield ( field) ) ) ;
66
+
67
+ i += 3 ;
68
+ } ,
33
69
INVOKESPECIAL => {
34
70
let method = u16:: from_be_bytes (
35
71
[ bytes[ i + 1 ] , bytes[ i + 2 ] ]
@@ -52,9 +88,13 @@ impl ToString for Bytecode {
52
88
use Bytecode :: * ;
53
89
54
90
match self {
91
+ Iload_1 => "iload_1" . to_string ( ) ,
55
92
Aload_0 => "aload_0" . to_string ( ) ,
93
+ Ireturn => "ireturn" . to_string ( ) ,
56
94
Return => "return" . to_string ( ) ,
57
- Invokespecial ( method) => format ! ( "invokespecial #{}" , method) ,
95
+ Getfield ( field) => format ! ( "{:13} #{}" , "getfield" , field) ,
96
+ Putfield ( field) => format ! ( "{:13} #{}" , "putfield" , field) ,
97
+ Invokespecial ( method) => format ! ( "{:13} #{}" , "invokespecial" , method) ,
58
98
_ => panic ! ( ) ,
59
99
}
60
100
}
0 commit comments