Skip to content

Commit 5ef7860

Browse files
committed
aml: fix behaviour of binary ops
Previous code did not correctly handle stores and had a bug in argument extraction somehow.
1 parent df5778a commit 5ef7860

File tree

1 file changed

+7
-14
lines changed

1 file changed

+7
-14
lines changed

aml/src/lib.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,27 +1092,19 @@ where
10921092
}
10931093

10941094
fn do_binary_maths(&self, context: &mut MethodContext, op: OpInFlight) -> Result<(), AmlError> {
1095-
let [Argument::Object(left), Argument::Object(right), Argument::Object(target)] = &op.arguments[0..2]
1096-
else {
1097-
Err(AmlError::InvalidOperationOnObject)?
1098-
};
1099-
let target2 = if op.op == Opcode::Divide {
1100-
let Argument::Object(target2) = &op.arguments[3] else { panic!() };
1101-
Some(target2)
1102-
} else {
1103-
None
1104-
};
1095+
let [Argument::Object(left), Argument::Object(right), target] = &op.arguments[0..3] else { panic!() };
1096+
let target2 = if op.op == Opcode::Divide { Some(&op.arguments[3]) } else { None };
11051097

11061098
let left = left.clone().unwrap_transparent_reference().as_integer()?;
11071099
let right = right.clone().unwrap_transparent_reference().as_integer()?;
11081100

1109-
let value = match op.op {
1101+
let result = match op.op {
11101102
Opcode::Add => left.wrapping_add(right),
11111103
Opcode::Subtract => left.wrapping_sub(right),
11121104
Opcode::Multiply => left.wrapping_mul(right),
11131105
Opcode::Divide => {
11141106
if let Some(remainder) = target2 {
1115-
*remainder.gain_mut() = Object::Integer(left.wrapping_rem(right));
1107+
self.do_store(context, remainder, Arc::new(Object::Integer(left.wrapping_rem(right))))?;
11161108
}
11171109
left.wrapping_div_euclid(right)
11181110
}
@@ -1127,8 +1119,9 @@ where
11271119
_ => panic!(),
11281120
};
11291121

1130-
*target.gain_mut() = Object::Integer(value);
1131-
context.contribute_arg(Argument::Object(Arc::new(Object::Integer(value))));
1122+
let result = Arc::new(Object::Integer(result));
1123+
self.do_store(context, target, result.clone())?;
1124+
context.contribute_arg(Argument::Object(result));
11321125
Ok(())
11331126
}
11341127

0 commit comments

Comments
 (0)