diff --git a/vm/src/builtins/genericalias.rs b/vm/src/builtins/genericalias.rs index c89291ecc8..d0c1e35064 100644 --- a/vm/src/builtins/genericalias.rs +++ b/vm/src/builtins/genericalias.rs @@ -1,4 +1,4 @@ -use crate::builtins::{PyStr, PyTuple, PyTupleRef, PyTypeRef}; +use crate::builtins::{PyStr, PyTupleRef, PyTypeRef}; use crate::common::hash; use crate::slots::{Hashable, SlotConstructor}; use crate::{ @@ -14,8 +14,6 @@ pub struct PyGenericAlias { parameters: PyTupleRef, } -pub type PyGenericAliasRef = PyRef; - impl fmt::Debug for PyGenericAlias { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str("GenericAlias") @@ -50,17 +48,14 @@ impl PyGenericAlias { let args: PyTupleRef = if let Ok(tuple) = PyTupleRef::try_from_object(vm, args.clone()) { tuple } else { - vm.ctx - .new_tuple(vec![args]) - .downcast::() - .ok() - .unwrap() + PyTupleRef::with_elements(vec![args], &vm.ctx) }; + let parameters = make_parameters(&args, vm); Self { origin, - args: args.clone(), - parameters: make_parameters(args, vm), + args, + parameters, } } @@ -123,16 +118,13 @@ impl PyGenericAlias { fn is_typevar(obj: PyObjectRef) -> bool { let class = obj.class(); class.tp_name() == "TypeVar" - && match class.get_attr("__module__") { - Some(o) => o - .downcast_ref::() - .map(|s| s.as_str() == "typing") - .unwrap_or(false), - None => false, - } + && class + .get_attr("__module__") + .and_then(|o| o.downcast_ref::().map(|s| s.as_str() == "typing")) + .unwrap_or(false) } -fn make_parameters(args: PyTupleRef, vm: &VirtualMachine) -> PyTupleRef { +fn make_parameters(args: &PyTupleRef, vm: &VirtualMachine) -> PyTupleRef { let mut parameters: Vec = vec![]; for arg in args.as_slice() { if is_typevar(arg.clone()) { @@ -147,11 +139,7 @@ fn make_parameters(args: PyTupleRef, vm: &VirtualMachine) -> PyTupleRef { } } - vm.ctx - .new_tuple(parameters) - .downcast::() - .ok() - .unwrap() + PyTupleRef::with_elements(parameters, &vm.ctx) } impl Hashable for PyGenericAlias { diff --git a/vm/src/builtins/list.rs b/vm/src/builtins/list.rs index 68f2edf650..a26693c84e 100644 --- a/vm/src/builtins/list.rs +++ b/vm/src/builtins/list.rs @@ -5,7 +5,7 @@ use std::ops::DerefMut; use crossbeam_utils::atomic::AtomicCell; -use super::genericalias::{PyGenericAlias, PyGenericAliasRef}; +use super::genericalias::PyGenericAlias; use super::int; use super::iter::{ IterStatus, @@ -414,8 +414,8 @@ impl PyList { } #[pyclassmethod(magic)] - fn class_getitem(cls: PyTypeRef, args: PyObjectRef, vm: &VirtualMachine) -> PyGenericAliasRef { - PyGenericAlias::new(cls, args, vm).into_ref(vm) + fn class_getitem(cls: PyTypeRef, args: PyObjectRef, vm: &VirtualMachine) -> PyGenericAlias { + PyGenericAlias::new(cls, args, vm) } }