forked from Rust-related/RustPython
Refactor PyGenericAlias type
Co-Authored-By: Jeong YunWon <youknowone@users.noreply.github.com> - Remove `PyGenericAliasRef`, the dedicated ref type of `PyGenericAlias`. - Use `PyTupleRef::with_elements` builder function. - Remove redundant `clone`. - Use more `Option<T>`'s functions instead `match` expr.
This commit is contained in:
@@ -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<PyGenericAlias>;
|
||||
|
||||
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::<PyTuple>()
|
||||
.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::<PyStr>()
|
||||
.map(|s| s.as_str() == "typing")
|
||||
.unwrap_or(false),
|
||||
None => false,
|
||||
}
|
||||
&& class
|
||||
.get_attr("__module__")
|
||||
.and_then(|o| o.downcast_ref::<PyStr>().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<PyObjectRef> = 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::<PyTuple>()
|
||||
.ok()
|
||||
.unwrap()
|
||||
PyTupleRef::with_elements(parameters, &vm.ctx)
|
||||
}
|
||||
|
||||
impl Hashable for PyGenericAlias {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user