@@ -121,12 +121,17 @@ where
121
121
| Opcode :: Xor => {
122
122
self . do_binary_maths ( & mut context, op) ?;
123
123
}
124
- Opcode :: FindSetLeftBit | Opcode :: FindSetRightBit => {
124
+ Opcode :: Not | Opcode :: FindSetLeftBit | Opcode :: FindSetRightBit => {
125
125
self . do_unary_maths ( & mut context, op) ?;
126
126
}
127
127
Opcode :: Increment | Opcode :: Decrement => {
128
128
let [ Argument :: Object ( operand) ] = & op. arguments [ ..] else { panic ! ( ) } ;
129
- let Object :: Integer ( operand) = operand. gain_mut ( ) else { panic ! ( ) } ;
129
+ let Object :: Integer ( operand) = operand. gain_mut ( ) else {
130
+ Err ( AmlError :: ObjectNotOfExpectedType {
131
+ expected : ObjectType :: Integer ,
132
+ got : operand. typ ( ) ,
133
+ } ) ?
134
+ } ;
130
135
131
136
let new_value = match op. op {
132
137
Opcode :: Increment => operand. wrapping_add ( 1 ) ,
@@ -163,7 +168,7 @@ where
163
168
else {
164
169
panic ! ( )
165
170
} ;
166
- let Object :: Integer ( arg) = * * arg else { panic ! ( ) } ;
171
+ let arg = arg. as_integer ( ) ? ;
167
172
self . handler . handle_fatal_error ( * typ, * code, arg) ;
168
173
}
169
174
Opcode :: OpRegion => {
@@ -176,9 +181,8 @@ where
176
181
else {
177
182
panic ! ( )
178
183
} ;
179
- let Object :: Integer ( region_offset) = * * region_offset else { panic ! ( ) } ;
180
- let Object :: Integer ( region_length) = * * region_length else { panic ! ( ) } ;
181
-
184
+ let region_offset = region_offset. as_integer ( ) ?;
185
+ let region_length = region_length. as_integer ( ) ?;
182
186
let region_space = RegionSpace :: from ( * region_space) ;
183
187
184
188
let region = Object :: OpRegion ( OpRegion {
@@ -197,7 +201,7 @@ where
197
201
else {
198
202
panic ! ( )
199
203
} ;
200
- let Object :: Integer ( buffer_size) = * * buffer_size else { panic ! ( ) } ;
204
+ let buffer_size = buffer_size. as_integer ( ) ? ;
201
205
202
206
let buffer_len = pkg_length - ( context. current_block . pc - start_pc) ;
203
207
let mut buffer = vec ! [ 0 ; buffer_size as usize ] ;
@@ -242,7 +246,7 @@ where
242
246
panic ! ( )
243
247
} ;
244
248
245
- let Object :: Integer ( predicate) = * * predicate else { panic ! ( ) } ;
249
+ let predicate = predicate. as_integer ( ) ? ;
246
250
let remaining_then_length = then_length - ( context. current_block . pc - start_pc) ;
247
251
248
252
if predicate > 0 {
@@ -267,7 +271,7 @@ where
267
271
panic ! ( )
268
272
} ;
269
273
let name = context. namestring ( ) ?;
270
- let Object :: Integer ( index) = * * index else { panic ! ( ) } ;
274
+ let index = index. as_integer ( ) ? ;
271
275
let ( offset, length) = match opcode {
272
276
Opcode :: CreateBitField => ( index, 1 ) ,
273
277
Opcode :: CreateByteField => ( index * 8 , 8 ) ,
@@ -292,8 +296,9 @@ where
292
296
panic ! ( )
293
297
} ;
294
298
let name = context. namestring ( ) ?;
295
- let Object :: Integer ( bit_index) = * * bit_index else { panic ! ( ) } ;
296
- let Object :: Integer ( num_bits) = * * num_bits else { panic ! ( ) } ;
299
+ let bit_index = bit_index. as_integer ( ) ?;
300
+ let num_bits = num_bits. as_integer ( ) ?;
301
+
297
302
self . namespace . lock ( ) . insert (
298
303
name. resolve ( & context. current_scope ) ?,
299
304
Arc :: new ( Object :: BufferField {
@@ -309,13 +314,11 @@ where
309
314
}
310
315
Opcode :: Sleep => {
311
316
let [ Argument :: Object ( msec) ] = & op. arguments [ ..] else { panic ! ( ) } ;
312
- let Object :: Integer ( msec) = * * msec else { panic ! ( ) } ;
313
- self . handler . sleep ( msec) ;
317
+ self . handler . sleep ( msec. as_integer ( ) ?) ;
314
318
}
315
319
Opcode :: Stall => {
316
320
let [ Argument :: Object ( usec) ] = & op. arguments [ ..] else { panic ! ( ) } ;
317
- let Object :: Integer ( usec) = * * usec else { panic ! ( ) } ;
318
- self . handler . stall ( usec) ;
321
+ self . handler . stall ( usec. as_integer ( ) ?) ;
319
322
}
320
323
Opcode :: InternalMethodCall => {
321
324
let [ Argument :: Object ( method) , Argument :: Namestring ( method_scope) ] = & op. arguments [ 0 ..2 ]
@@ -396,8 +399,7 @@ where
396
399
else {
397
400
panic ! ( )
398
401
} ;
399
- let Object :: Integer ( bank_value) = * * bank_value else { panic ! ( ) } ;
400
-
402
+ let bank_value = bank_value. as_integer ( ) ?;
401
403
let field_flags = context. next ( ) ?;
402
404
403
405
let ( region, bank) = {
@@ -954,12 +956,8 @@ where
954
956
None
955
957
} ;
956
958
957
- let Object :: Integer ( left) = * left. clone ( ) . unwrap_transparent_reference ( ) else {
958
- Err ( AmlError :: InvalidOperationOnObject ) ?
959
- } ;
960
- let Object :: Integer ( right) = * right. clone ( ) . unwrap_transparent_reference ( ) else {
961
- Err ( AmlError :: InvalidOperationOnObject ) ?
962
- } ;
959
+ let left = left. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
960
+ let right = right. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
963
961
964
962
let value = match op. op {
965
963
Opcode :: Add => left. wrapping_add ( right) ,
@@ -989,7 +987,7 @@ where
989
987
990
988
fn do_unary_maths ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
991
989
let [ Argument :: Object ( operand) ] = & op. arguments [ ..] else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
992
- let Object :: Integer ( operand) = * * operand else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
990
+ let operand = operand. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? ;
993
991
994
992
let result = match op. op {
995
993
Opcode :: FindSetLeftBit => {
@@ -1000,27 +998,34 @@ where
1000
998
* TODO: this is a particular instance where not respecting integers being
1001
999
* 32-bit on revision 1 tables does cause properly incorrect behaviour...
1002
1000
*/
1003
- operand. leading_zeros ( ) + 1
1001
+ ( operand. leading_zeros ( ) + 1 ) as u64
1004
1002
}
1005
1003
}
1006
1004
Opcode :: FindSetRightBit => {
1007
1005
if operand == 0 {
1008
1006
0
1009
1007
} else {
1010
- operand. trailing_zeros ( ) + 1
1008
+ ( operand. trailing_zeros ( ) + 1 ) as u64
1009
+ }
1010
+ }
1011
+ Opcode :: Not => {
1012
+ if operand == 0 {
1013
+ u64:: MAX
1014
+ } else {
1015
+ 0
1011
1016
}
1012
1017
}
1013
1018
_ => panic ! ( ) ,
1014
1019
} ;
1015
1020
1016
- context. contribute_arg ( Argument :: Object ( Arc :: new ( Object :: Integer ( result as u64 ) ) ) ) ;
1021
+ context. contribute_arg ( Argument :: Object ( Arc :: new ( Object :: Integer ( result) ) ) ) ;
1017
1022
Ok ( ( ) )
1018
1023
}
1019
1024
1020
1025
fn do_logical_op ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1021
1026
if op. op == Opcode :: LNot {
1022
1027
let [ Argument :: Object ( operand) ] = & op. arguments [ ..] else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1023
- let Object :: Integer ( operand) = * * operand else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1028
+ let operand = operand. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? ;
1024
1029
let result = if operand == 0 { u64:: MAX } else { 0 } ;
1025
1030
1026
1031
if let Some ( prev_op) = context. in_flight . last_mut ( ) {
@@ -1039,8 +1044,8 @@ where
1039
1044
// TODO: for some of the ops, strings and buffers are also allowed :(
1040
1045
// TODO: apparently when doing this conversion (^), NT's interpreter just takes the first 4
1041
1046
// bytes of the string/buffer and casts them to an integer lmao
1042
- let Object :: Integer ( left) = * * left else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1043
- let Object :: Integer ( right) = * * right else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1047
+ let left = left. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? ;
1048
+ let right = right. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? ;
1044
1049
1045
1050
let result = match op. op {
1046
1051
Opcode :: LAnd => ( left > 0 ) && ( right > 0 ) ,
@@ -1061,7 +1066,7 @@ where
1061
1066
1062
1067
fn do_from_bcd ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1063
1068
let [ Argument :: Object ( value) ] = & op. arguments [ ..] else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1064
- let Object :: Integer ( mut value) = * * value else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1069
+ let mut value = value. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? ;
1065
1070
1066
1071
let mut result = 0 ;
1067
1072
let mut i = 1 ;
@@ -1077,7 +1082,7 @@ where
1077
1082
1078
1083
fn do_to_bcd ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1079
1084
let [ Argument :: Object ( value) ] = & op. arguments [ ..] else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1080
- let Object :: Integer ( mut value) = * * value else { Err ( AmlError :: InvalidOperationOnObject ) ? } ;
1085
+ let mut value = value. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? ;
1081
1086
1082
1087
let mut result = 0 ;
1083
1088
let mut i = 0 ;
@@ -1110,9 +1115,7 @@ where
1110
1115
let [ Argument :: Object ( object) , Argument :: Object ( index_value) , target] = & op. arguments [ ..] else {
1111
1116
panic ! ( )
1112
1117
} ;
1113
- let Object :: Integer ( index_value) = * * index_value else {
1114
- Err ( AmlError :: ObjectNotOfExpectedType { expected : ObjectType :: Integer , got : index_value. typ ( ) } ) ?
1115
- } ;
1118
+ let index_value = index_value. as_integer ( ) ?;
1116
1119
1117
1120
let result = Arc :: new ( match * * object {
1118
1121
Object :: Buffer ( ref buffer) => {
@@ -1319,7 +1322,7 @@ impl MethodContext {
1319
1322
} ;
1320
1323
Ok ( context)
1321
1324
} else {
1322
- panic ! ( )
1325
+ Err ( AmlError :: ObjectNotOfExpectedType { expected : ObjectType :: Method , got : method . typ ( ) } )
1323
1326
}
1324
1327
}
1325
1328
0 commit comments