From d18c641604f112b771d1d9008542801e2b7352e1 Mon Sep 17 00:00:00 2001 From: Hyunmin Shin Date: Wed, 10 Aug 2022 11:34:47 +0900 Subject: [PATCH 1/2] Resolve: test_union_parameter_chaining --- Lib/test/test_types.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 1d7d709d8..af5e3e11d 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -815,8 +815,6 @@ class UnionTests(unittest.TestCase): check(x | None, (x, type(None))) check(None | x, (type(None), x)) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_union_parameter_chaining(self): T = typing.TypeVar("T") S = typing.TypeVar("S") From b333355026a1ea98096bafcbdaf15936692515e5 Mon Sep 17 00:00:00 2001 From: Hyunmin Shin Date: Wed, 10 Aug 2022 11:51:51 +0900 Subject: [PATCH 2/2] Fix: making parameters `make_parameters`: Add `dedup_and_flatten_args` for duplicated elements `dedup_and_flatten_args`: Fix a problem doesn't work for `genericalias` --- vm/src/builtins/union.rs | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/vm/src/builtins/union.rs b/vm/src/builtins/union.rs index 31da9a439..d39e9d669 100644 --- a/vm/src/builtins/union.rs +++ b/vm/src/builtins/union.rs @@ -1,6 +1,6 @@ use super::{genericalias, type_}; use crate::{ - builtins::{PyFrozenSet, PyStr, PyStrRef, PyTuple, PyTupleRef, PyType, PyTypeRef}, + builtins::{PyFrozenSet, PyStr, PyStrRef, PyTuple, PyTupleRef, PyType}, class::PyClassImpl, common::hash, convert::ToPyObject, @@ -163,7 +163,7 @@ fn make_parameters(args: &PyTupleRef, vm: &VirtualMachine) -> PyTupleRef { } parameters.shrink_to_fit(); - PyTuple::new_ref(parameters, &vm.ctx) + dedup_and_flatten_args(PyTuple::new_ref(parameters, &vm.ctx), vm) } fn flatten_args(args: PyTupleRef, vm: &VirtualMachine) -> PyTupleRef { @@ -196,21 +196,10 @@ fn dedup_and_flatten_args(args: PyTupleRef, vm: &VirtualMachine) -> PyTupleRef { let mut new_args: Vec = Vec::with_capacity(args.len()); for arg in &args { if !new_args.iter().any(|param| { - match ( - PyTypeRef::try_from_object(vm, param.clone()), - PyTypeRef::try_from_object(vm, arg.clone()), - ) { - (Ok(a), Ok(b)) - if a.is(vm.ctx.types.generic_alias_type) - && b.is(vm.ctx.types.generic_alias_type) => - { - param - .rich_compare_bool(arg, PyComparisonOp::Eq, vm) - .ok() - .unwrap() - } - _ => param.is(arg), - } + param + .rich_compare_bool(arg, PyComparisonOp::Eq, vm) + .ok() + .unwrap() }) { new_args.push(arg.clone()); }