Skip to content

Commit b4360f8

Browse files
committed
Update function __qualname__
1 parent 2a26ed0 commit b4360f8

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

vm/src/builtins/function.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
bytecode,
1515
class::PyClassImpl,
1616
frame::Frame,
17-
function::{FuncArgs, OptionalArg, PyComparisonValue},
17+
function::{FuncArgs, OptionalArg, PyComparisonValue, PySetterValue},
1818
scope::Scope,
1919
types::{Callable, Comparable, Constructor, GetAttr, GetDescriptor, PyComparisonOp},
2020
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
@@ -31,6 +31,7 @@ pub struct PyFunction {
3131
closure: Option<PyTupleTyped<PyCellRef>>,
3232
defaults_and_kwdefaults: PyMutex<(Option<PyTupleRef>, Option<PyDictRef>)>,
3333
name: PyMutex<PyStrRef>,
34+
qualname: PyMutex<PyStrRef>,
3435
#[cfg(feature = "jit")]
3536
jitted_code: OnceCell<CompiledCode>,
3637
}
@@ -42,6 +43,7 @@ impl PyFunction {
4243
closure: Option<PyTupleTyped<PyCellRef>>,
4344
defaults: Option<PyTupleRef>,
4445
kw_only_defaults: Option<PyDictRef>,
46+
qualname: PyMutex<PyStrRef>,
4547
) -> Self {
4648
let name = PyMutex::new(code.obj_name.to_owned());
4749
PyFunction {
@@ -50,6 +52,7 @@ impl PyFunction {
5052
closure,
5153
defaults_and_kwdefaults: PyMutex::new((defaults, kw_only_defaults)),
5254
name,
55+
qualname,
5356
#[cfg(feature = "jit")]
5457
jitted_code: OnceCell::new(),
5558
}
@@ -380,6 +383,32 @@ impl PyFunction {
380383
*self.name.lock() = name;
381384
}
382385

386+
#[pygetset(magic)]
387+
fn qualname(&self) -> PyStrRef {
388+
self.qualname.lock().clone()
389+
}
390+
391+
#[pygetset(magic, setter)]
392+
fn set_qualname(&self, value: PySetterValue, vm: &VirtualMachine) -> PyResult<()> {
393+
match value {
394+
PySetterValue::Assign(value) => {
395+
if let Ok(qualname) = value.downcast::<PyStr>() {
396+
*self.qualname.lock() = qualname;
397+
} else {
398+
return Err(vm.new_type_error(
399+
"__qualname__ must be set to a string object".to_string(),
400+
));
401+
}
402+
}
403+
PySetterValue::Delete => {
404+
return Err(
405+
vm.new_type_error("__qualname__ must be set to a string object".to_string())
406+
);
407+
}
408+
}
409+
Ok(())
410+
}
411+
383412
#[pymethod(magic)]
384413
fn repr(zelf: PyRef<Self>, vm: &VirtualMachine) -> String {
385414
let qualname = zelf

vm/src/frame.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,7 @@ impl ExecutingFrame<'_> {
15611561
closure,
15621562
defaults,
15631563
kw_only_defaults,
1564+
PyMutex::new(qualified_name.clone()),
15641565
)
15651566
.into_pyobject(vm);
15661567

0 commit comments

Comments
 (0)