Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
remove duplicated _call_typing_func_object() functions
Move _call_typing_func_object() code to
stdlib::typing::call_typing_func_object().
Use that function everywhere.
  • Loading branch information
Elmir Jagudin authored and elmjag committed Feb 4, 2026
commit 3d99a7905a02e4f18829b4ad1158371759ac95ad
25 changes: 8 additions & 17 deletions crates/vm/src/stdlib/typevar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,21 @@ pub use typevar::*;
pub(crate) mod typevar {
use crate::{
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
builtins::{PyTuple, PyTupleRef, PyType, PyTypeRef, make_union, pystr::AsPyStr},
builtins::{PyTuple, PyTupleRef, PyType, PyTypeRef, make_union},
common::lock::PyMutex,
function::{FuncArgs, IntoFuncArgs, PyComparisonValue},
function::{FuncArgs, PyComparisonValue},
protocol::PyNumberMethods,
stdlib::typing::call_typing_func_object,
types::{AsNumber, Comparable, Constructor, Iterable, PyComparisonOp, Representable},
};

pub(crate) fn _call_typing_func_object<'a>(
vm: &VirtualMachine,
func_name: impl AsPyStr<'a>,
args: impl IntoFuncArgs,
) -> PyResult {
let module = vm.import("typing", 0)?;
let func = module.get_attr(func_name.as_pystr(&vm.ctx), vm)?;
func.call(args, vm)
}

fn type_check(arg: PyObjectRef, msg: &str, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
// Calling typing.py here leads to bootstrapping problems
if vm.is_none(&arg) {
return Ok(arg.class().to_owned().into());
}
let message_str: PyObjectRef = vm.ctx.new_str(msg).into();
_call_typing_func_object(vm, "_type_check", (arg, message_str))
call_typing_func_object(vm, "_type_check", (arg, message_str))
}

/// Get the module of the caller frame, similar to CPython's caller() function.
Expand Down Expand Up @@ -169,7 +160,7 @@ pub(crate) mod typevar {
vm: &VirtualMachine,
) -> PyResult {
let self_obj: PyObjectRef = zelf.into();
_call_typing_func_object(vm, "_typevar_subst", (self_obj, arg))
call_typing_func_object(vm, "_typevar_subst", (self_obj, arg))
}

#[pymethod]
Expand Down Expand Up @@ -514,7 +505,7 @@ pub(crate) mod typevar {
vm: &VirtualMachine,
) -> PyResult {
let self_obj: PyObjectRef = zelf.into();
_call_typing_func_object(vm, "_paramspec_subst", (self_obj, arg))
call_typing_func_object(vm, "_paramspec_subst", (self_obj, arg))
}

#[pymethod]
Expand All @@ -525,7 +516,7 @@ pub(crate) mod typevar {
vm: &VirtualMachine,
) -> PyResult {
let self_obj: PyObjectRef = zelf.into();
_call_typing_func_object(vm, "_paramspec_prepare_subst", (self_obj, alias, args))
call_typing_func_object(vm, "_paramspec_prepare_subst", (self_obj, alias, args))
}
}

Expand Down Expand Up @@ -711,7 +702,7 @@ pub(crate) mod typevar {
vm: &VirtualMachine,
) -> PyResult {
let self_obj: PyObjectRef = zelf.into();
_call_typing_func_object(vm, "_typevartuple_prepare_subst", (self_obj, alias, args))
call_typing_func_object(vm, "_typevartuple_prepare_subst", (self_obj, alias, args))
}
}

Expand Down
29 changes: 16 additions & 13 deletions crates/vm/src/stdlib/typing.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// spell-checker:ignore typevarobject funcobj
use crate::{Context, class::PyClassImpl};
use crate::{
Context, PyResult, VirtualMachine, builtins::pystr::AsPyStr, class::PyClassImpl,
function::IntoFuncArgs,
};

pub use crate::stdlib::typevar::{
Generic, ParamSpec, ParamSpecArgs, ParamSpecKwargs, TypeVar, TypeVarTuple,
Expand All @@ -13,26 +16,26 @@ pub fn init(ctx: &Context) {
NoDefault::extend_class(ctx, ctx.types.typing_no_default_type);
}

pub fn call_typing_func_object<'a>(
vm: &VirtualMachine,
func_name: impl AsPyStr<'a>,
args: impl IntoFuncArgs,
) -> PyResult {
let module = vm.import("typing", 0)?;
let func = module.get_attr(func_name.as_pystr(&vm.ctx), vm)?;
func.call(args, vm)
}

#[pymodule(name = "_typing", with(super::typevar::typevar))]
pub(crate) mod decl {
use crate::{
Py, PyObjectRef, PyPayload, PyResult, VirtualMachine,
builtins::{PyStrRef, PyTupleRef, PyType, PyTypeRef, pystr::AsPyStr, type_},
function::{FuncArgs, IntoFuncArgs},
builtins::{PyStrRef, PyTupleRef, PyType, PyTypeRef, type_},
function::FuncArgs,
protocol::PyNumberMethods,
types::{AsNumber, Constructor, Representable},
};

pub(crate) fn _call_typing_func_object<'a>(
vm: &VirtualMachine,
func_name: impl AsPyStr<'a>,
args: impl IntoFuncArgs,
) -> PyResult {
let module = vm.import("typing", 0)?;
let func = module.get_attr(func_name.as_pystr(&vm.ctx), vm)?;
func.call(args, vm)
}

#[pyfunction]
pub(crate) fn _idfunc(args: FuncArgs, _vm: &VirtualMachine) -> PyObjectRef {
args.args[0].clone()
Expand Down