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:
Moreal
2021-09-21 00:23:40 +09:00
parent 7c3939a149
commit da79719063
2 changed files with 14 additions and 26 deletions

View File

@@ -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 {

View File

@@ -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)
}
}