@@ -93,40 +93,65 @@ enum_string!(pub AddressMode {
93
93
} ) ;
94
94
95
95
impl Default for AddressMode {
96
- fn default ( ) -> AddressMode {
97
- AddressMode :: Direct
96
+ fn default ( ) -> Self {
97
+ Self :: Immediate
98
98
}
99
99
}
100
100
101
- #[ derive( Copy , Clone , Default , Debug , PartialEq ) ]
101
+ #[ derive( Clone , Debug , PartialEq ) ]
102
+ pub enum Value {
103
+ Label ( String ) ,
104
+ Literal ( i32 ) ,
105
+ }
106
+
107
+ impl Default for Value {
108
+ fn default ( ) -> Self {
109
+ Self :: Literal ( 0 )
110
+ }
111
+ }
112
+
113
+ impl ToString for Value {
114
+ fn to_string ( & self ) -> String {
115
+ match self {
116
+ Self :: Label ( value) => value. clone ( ) ,
117
+ Self :: Literal ( value) => value. to_string ( ) ,
118
+ }
119
+ }
120
+ }
121
+
122
+ #[ derive( Clone , Default , Debug , PartialEq ) ]
102
123
pub struct Field {
103
124
pub address_mode : AddressMode ,
104
- pub value : i32 ,
125
+ pub value : Value ,
105
126
}
106
127
107
128
impl Field {
108
- pub fn direct ( value : i32 ) -> Field {
109
- Field {
129
+ pub fn direct ( value : i32 ) -> Self {
130
+ Self {
110
131
address_mode : AddressMode :: Direct ,
111
- value,
132
+ value : Value :: Literal ( value ) ,
112
133
}
113
134
}
114
135
115
136
pub fn immediate ( value : i32 ) -> Field {
116
- Field {
137
+ Self {
117
138
address_mode : AddressMode :: Immediate ,
118
- value,
139
+ value : Value :: Literal ( value ) ,
119
140
}
120
141
}
121
142
}
122
143
123
144
impl ToString for Field {
124
145
fn to_string ( & self ) -> String {
125
- format ! ( "{}{}" , self . address_mode. to_string( ) , self . value)
146
+ format ! (
147
+ "{}{}" ,
148
+ self . address_mode. to_string( ) ,
149
+ self . value. to_string( )
150
+ )
126
151
}
127
152
}
128
153
129
- #[ derive( Copy , Clone , Default , Debug , PartialEq ) ]
154
+ #[ derive( Clone , Debug , Default , PartialEq ) ]
130
155
pub struct Instruction {
131
156
pub opcode : Opcode ,
132
157
pub modifier : Modifier ,
@@ -194,6 +219,7 @@ impl Core {
194
219
) ) ;
195
220
}
196
221
222
+ // TODO: make this nice with some kind of try_insert
197
223
labels
198
224
. into_iter ( )
199
225
. map ( |label| match self . labels . entry ( label. into ( ) ) {
@@ -238,7 +264,7 @@ impl fmt::Debug for Core {
238
264
fn fmt ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
239
265
write ! (
240
266
formatter,
241
- "Labels:\n {:?}\n Core :\n {}" ,
267
+ "Labels:{:?}\n Core :\n {}" ,
242
268
self . labels,
243
269
self . dump( )
244
270
)
@@ -259,11 +285,11 @@ mod tests {
259
285
modifier : Modifier :: F ,
260
286
field_a : Field {
261
287
address_mode : AddressMode :: Direct ,
262
- value : 0 ,
288
+ value : Value :: Literal ( 0 ) ,
263
289
} ,
264
290
field_b : Field {
265
291
address_mode : AddressMode :: Direct ,
266
- value : 0 ,
292
+ value : Value :: Literal ( 0 ) ,
267
293
} ,
268
294
} ;
269
295
@@ -281,6 +307,16 @@ mod tests {
281
307
}
282
308
}
283
309
310
+ #[ test]
311
+ fn value_to_string ( ) {
312
+ assert_eq ! (
313
+ String :: from( "some_label" ) ,
314
+ Value :: Label ( String :: from( "some_label" ) ) . to_string( )
315
+ ) ;
316
+
317
+ assert_eq ! ( String :: from( "123" ) , Value :: Literal ( 123 ) . to_string( ) ) ;
318
+ }
319
+
284
320
#[ test]
285
321
fn modifier_b_default ( ) {
286
322
let opcodes = [ Mov , Cmp , Seq , Sne ] ;
@@ -388,6 +424,9 @@ mod tests {
388
424
core. add_labels ( 256 , vec ! [ "goblin" ] )
389
425
. expect_err ( "Should have failed to add labels for 256, but didn't" ) ;
390
426
427
+ core. add_labels ( 5 , vec ! [ "baz" ] )
428
+ . expect_err ( "Should have failed to add duplicate label" ) ;
429
+
391
430
assert_eq ! ( core. label_address( "foo" ) . unwrap( ) , 0 ) ;
392
431
assert_eq ! ( core. label_address( "bar" ) . unwrap( ) , 0 ) ;
393
432
assert_eq ! ( core. label_address( "baz" ) . unwrap( ) , 123 ) ;
0 commit comments