diff --git a/src/protocol/eval/value.rs b/src/protocol/eval/value.rs index d08d327fecbb3faaaa79ae2c9b7629ebb8ba8a4e..b6c8b42c3ca0ec60c9cbcc702bdd854b4cb5fc35 100644 --- a/src/protocol/eval/value.rs +++ b/src/protocol/eval/value.rs @@ -58,6 +58,7 @@ pub enum Value { SInt32(i32), SInt64(i64), Array(HeapPos), + Tuple(HeapPos), // Instances of user-defined types Enum(i64), Union(i64, HeapPos), @@ -94,6 +95,7 @@ impl_union_unpack_as_value!(as_sint16, Value::SInt16, i16); impl_union_unpack_as_value!(as_sint32, Value::SInt32, i32); impl_union_unpack_as_value!(as_sint64, Value::SInt64, i64); impl_union_unpack_as_value!(as_array, Value::Array, HeapPos); +impl_union_unpack_as_value!(as_tuple, Value::Tuple, HeapPos); impl_union_unpack_as_value!(as_enum, Value::Enum, i64); impl_union_unpack_as_value!(as_struct, Value::Struct, HeapPos); @@ -154,6 +156,7 @@ impl Value { Value::Message(v) => Some(*v), Value::String(v) => Some(*v), Value::Array(v) => Some(*v), + Value::Tuple(v) => Some(*v), Value::Union(_, v) => Some(*v), Value::Struct(v) => Some(*v), _ => None @@ -222,6 +225,7 @@ impl ValueGroup { Value::Message(_) => Value::Message(new_region_idx), Value::String(_) => Value::String(new_region_idx), Value::Array(_) => Value::Array(new_region_idx), + Value::Tuple(_) => Value::Tuple(new_region_idx), Value::Union(tag, _) => Value::Union(*tag, new_region_idx), Value::Struct(_) => Value::Struct(new_region_idx), _ => unreachable!(), @@ -268,6 +272,7 @@ impl ValueGroup { Value::Message(_) => Value::Message(to_heap_pos), Value::String(_) => Value::String(to_heap_pos), Value::Array(_) => Value::Array(to_heap_pos), + Value::Tuple(_) => Value::Tuple(to_heap_pos), Value::Union(tag, _) => Value::Union(*tag, to_heap_pos), Value::Struct(_) => Value::Struct(to_heap_pos), _ => unreachable!(), @@ -328,6 +333,7 @@ pub(crate) fn apply_assignment_operator(store: &mut Store, lhs: ValueId, op: Ass Value::SInt32(v) => { *v = rhs.as_sint32(); }, Value::SInt64(v) => { *v = rhs.as_sint64(); }, Value::Array(v) => { to_dealloc = Some(*v); *v = rhs.as_array(); }, + Value::Tuple(v) => { to_dealloc = Some(*v); *v = rhs.as_tuple(); }, Value::Enum(v) => { *v = rhs.as_enum(); }, Value::Union(lhs_tag, lhs_heap_pos) => { to_dealloc = Some(*lhs_heap_pos); @@ -790,6 +796,7 @@ pub(crate) fn apply_equality_operator(store: &Store, lhs: &Value, rhs: &Value) - Value::SInt32(v) => *v == rhs.as_sint32(), Value::SInt64(v) => *v == rhs.as_sint64(), Value::Array(lhs_pos) => eval_equality_heap(store, *lhs_pos, rhs.as_array()), + Value::Tuple(lhs_pos) => eval_equality_heap(store, *lhs_pos, rhs.as_tuple()), Value::Enum(v) => *v == rhs.as_enum(), Value::Union(lhs_tag, lhs_pos) => { let (rhs_tag, rhs_pos) = rhs.as_union(); @@ -844,6 +851,7 @@ pub(crate) fn apply_inequality_operator(store: &Store, lhs: &Value, rhs: &Value) Value::SInt32(v) => *v != rhs.as_sint32(), Value::SInt64(v) => *v != rhs.as_sint64(), Value::Array(lhs_pos) => eval_inequality_heap(store, *lhs_pos, rhs.as_array()), + Value::Tuple(lhs_pos) => eval_inequality_heap(store, *lhs_pos, rhs.as_tuple()), Value::Enum(v) => *v != rhs.as_enum(), Value::Union(lhs_tag, lhs_pos) => { let (rhs_tag, rhs_pos) = rhs.as_union(); @@ -909,6 +917,7 @@ pub(crate) fn apply_binding_operator(store: &mut Store, lhs: Value, rhs: Value) Value::SInt32(v) => v == rhs.as_sint32(), Value::SInt64(v) => v == rhs.as_sint64(), Value::Array(lhs_pos) => eval_binding_heap(store, lhs_pos, rhs.as_array()), + Value::Tuple(lhs_pos) => eval_binding_heap(store, lhs_pos, rhs.as_tuple()), Value::Enum(v) => v == rhs.as_enum(), Value::Union(lhs_tag, lhs_pos) => { let (rhs_tag, rhs_pos) = rhs.as_union();