@@ -1130,11 +1130,47 @@ where
1130
1130
Err ( AmlError :: InvalidOperationOnObject ) ?
1131
1131
} ;
1132
1132
1133
- // TODO: for some of the ops, strings and buffers are also allowed :(
1134
- // TODO: apparently when doing this conversion (^), NT's interpreter just takes the first 4
1135
- // bytes of the string/buffer and casts them to an integer lmao
1136
- let left = left. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
1137
- let right = right. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
1133
+ /*
1134
+ * Some of these operations allow strings and buffers to be used as operands. Apparently
1135
+ * NT's interpreter just takes the first 4 bytes of the string/buffer and casts them as an
1136
+ * integer...
1137
+ */
1138
+ let left = left. clone ( ) . unwrap_transparent_reference ( ) ;
1139
+ let right = right. clone ( ) . unwrap_transparent_reference ( ) ;
1140
+ let ( left, right) = match * left {
1141
+ Object :: Integer ( left) => ( left, right. as_integer ( ) ?) ,
1142
+ Object :: String ( ref left) => {
1143
+ let left = {
1144
+ let mut bytes = [ 0u8 ; 4 ] ;
1145
+ let left_bytes = left. as_bytes ( ) ;
1146
+ ( bytes[ 0 ..left_bytes. len ( ) ] ) . copy_from_slice ( left_bytes) ;
1147
+ u32:: from_le_bytes ( bytes) as u64
1148
+ } ;
1149
+ let right = {
1150
+ let mut bytes = [ 0u8 ; 4 ] ;
1151
+ let right = right. as_string ( ) ?;
1152
+ let right_bytes = right. as_bytes ( ) ;
1153
+ ( bytes[ 0 ..right_bytes. len ( ) ] ) . copy_from_slice ( right_bytes) ;
1154
+ u32:: from_le_bytes ( bytes) as u64
1155
+ } ;
1156
+ ( left, right)
1157
+ }
1158
+ Object :: Buffer ( ref left) => {
1159
+ let Object :: Buffer ( ref right) = * right else { panic ! ( ) } ;
1160
+ let left = {
1161
+ let mut bytes = [ 0u8 ; 4 ] ;
1162
+ ( bytes[ 0 ..left. len ( ) ] ) . copy_from_slice ( left) ;
1163
+ u32:: from_le_bytes ( bytes) as u64
1164
+ } ;
1165
+ let right = {
1166
+ let mut bytes = [ 0u8 ; 4 ] ;
1167
+ ( bytes[ 0 ..right. len ( ) ] ) . copy_from_slice ( right) ;
1168
+ u32:: from_le_bytes ( bytes) as u64
1169
+ } ;
1170
+ ( left, right)
1171
+ }
1172
+ _ => panic ! ( ) ,
1173
+ } ;
1138
1174
1139
1175
let result = match op. op {
1140
1176
Opcode :: LAnd => ( left > 0 ) && ( right > 0 ) ,
0 commit comments