diff --git a/src/vm/mod.rs b/src/vm/mod.rs index be00f16..b61efdf 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -1042,26 +1042,27 @@ impl ClosureRunner { Instruction::Equal(res, lhs, rhs) => { let (lhs, rhs) = self.lhs_and_rhs(lhs, rhs); - match (&lhs, &rhs) { - (Value::Table { metatable, .. }, Value::Table { .. }) => { - self.set_stack( - *res, - StackValue::Value(Value::Boolean(LuaBool( - self.call_metamethod( - metatable, - "__eq", - vec![lhs.clone(), rhs.clone()], - )?? - .first() - .unwrap() - .is_truthy(), - ))), - ); + + let metatable = match (&lhs, &rhs) { + (Value::Table { metatable, .. }, _) => Some(metatable), + (_, Value::Table { metatable, .. }) => Some(metatable), + _ => todo!(), + }; + + let value = if let Some(metatable) = metatable { + match self.call_metamethod( + metatable, + "__eq", + vec![lhs.clone(), rhs.clone()], + ) { + Ok(value) => StackValue::Value(extract_ret_value(value)?), + Err(_) => StackValue::Value(lhs.eq(&rhs)?), } - _ => { - self.set_stack(*res, StackValue::Value(lhs.eq(&rhs)?)); - } - } + } else { + StackValue::Value(lhs.eq(&rhs)?) + }; + + self.set_stack(*res, value); } Instruction::LessThan(res, lhs, rhs) => { let (lhs, rhs) = self.lhs_and_rhs(lhs, rhs);