mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Compare commits
3 Commits
2025-07-28
...
impl_del_o
| Author | SHA1 | Date | |
|---|---|---|---|
| b8d6f7b594 | |||
| dc0a75e903 | |||
| c40d24ed68 |
@@ -495,9 +495,14 @@ pub fn object_get_dict(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyDict
|
|||||||
obj.dict()
|
obj.dict()
|
||||||
.ok_or_else(|| vm.new_attribute_error("This object has no __dict__".to_owned()))
|
.ok_or_else(|| vm.new_attribute_error("This object has no __dict__".to_owned()))
|
||||||
}
|
}
|
||||||
pub fn object_set_dict(obj: PyObjectRef, dict: PyDictRef, vm: &VirtualMachine) -> PyResult<()> {
|
|
||||||
|
pub fn object_set_dict(
|
||||||
|
obj: PyObjectRef,
|
||||||
|
dict: PySetterValue<PyDictRef>,
|
||||||
|
vm: &VirtualMachine,
|
||||||
|
) -> PyResult<()> {
|
||||||
obj.set_dict(dict)
|
obj.set_dict(dict)
|
||||||
.map_err(|_| vm.new_attribute_error("This object has no __dict__".to_owned()))
|
.map_err(|_| vm.new_attribute_error("This object has no __dict__ to delete".to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(ctx: &Context) {
|
pub fn init(ctx: &Context) {
|
||||||
|
|||||||
@@ -1288,7 +1288,7 @@ fn subtype_set_dict(obj: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -
|
|||||||
descr_set(&descr, obj, PySetterValue::Assign(value), vm)
|
descr_set(&descr, obj, PySetterValue::Assign(value), vm)
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
object::object_set_dict(obj, value.try_into_value(vm)?, vm)?;
|
object::object_set_dict(obj, PySetterValue::Assign(value.try_into_value(vm)?), vm)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,8 +36,10 @@ where
|
|||||||
{
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from_setter_value(vm: &VirtualMachine, obj: PySetterValue) -> PyResult<Self> {
|
fn from_setter_value(vm: &VirtualMachine, obj: PySetterValue) -> PyResult<Self> {
|
||||||
let obj = obj.ok_or_else(|| vm.new_type_error("can't delete attribute".to_owned()))?;
|
match obj {
|
||||||
T::try_from_object(vm, obj)
|
PySetterValue::Assign(obj) => T::try_from_object(vm, obj),
|
||||||
|
PySetterValue::Delete => T::try_from_object(vm, vm.ctx.none()),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ use crate::{
|
|||||||
lock::{PyMutex, PyMutexGuard, PyRwLock},
|
lock::{PyMutex, PyMutexGuard, PyRwLock},
|
||||||
refcount::RefCount,
|
refcount::RefCount,
|
||||||
},
|
},
|
||||||
|
function::PySetterValue,
|
||||||
vm::VirtualMachine,
|
vm::VirtualMachine,
|
||||||
};
|
};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
@@ -707,13 +708,27 @@ impl PyObject {
|
|||||||
|
|
||||||
/// Set the dict field. Returns `Err(dict)` if this object does not have a dict field
|
/// Set the dict field. Returns `Err(dict)` if this object does not have a dict field
|
||||||
/// in the first place.
|
/// in the first place.
|
||||||
pub fn set_dict(&self, dict: PyDictRef) -> Result<(), PyDictRef> {
|
pub fn set_dict(&self, dict: PySetterValue<PyDictRef>) -> Result<(), PySetterValue<PyDictRef>> {
|
||||||
match self.instance_dict() {
|
match (self.instance_dict(), dict) {
|
||||||
Some(d) => {
|
(Some(d), PySetterValue::Assign(dict)) => {
|
||||||
d.set(dict);
|
d.set(dict);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
None => Err(dict),
|
(None, PySetterValue::Assign(dict)) => {
|
||||||
|
unsafe {
|
||||||
|
let ptr = self as *const _ as *mut PyObject;
|
||||||
|
(*ptr).0.dict = Some(InstanceDict::new(dict));
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
(Some(_), PySetterValue::Delete) => {
|
||||||
|
unsafe {
|
||||||
|
let ptr = self as *const _ as *mut PyObject;
|
||||||
|
(*ptr).0.dict = None;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
(None, PySetterValue::Delete) => Err(PySetterValue::Delete),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user