mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 03:04:38 +08:00
Fix slot call deadlock
This commit is contained in:
1 parent
60598b699e
commit
770f166edf
7 files changed
+23
-21
No files matched your search
@@ -667,11 +667,12 @@ impl GetAttr for PyType {
|
||||
|
||||
if let Some(ref attr) = mcl_attr {
|
||||
let attr_class = attr.class();
|
||||
if attr_class
|
||||
let has_descr_set = attr_class
|
||||
.mro_find_map(|cls| cls.slots.descr_set.load())
|
||||
.is_some()
|
||||
{
|
||||
if let Some(descr_get) = attr_class.mro_find_map(|cls| cls.slots.descr_get.load()) {
|
||||
.is_some();
|
||||
if has_descr_set {
|
||||
let descr_get = attr_class.mro_find_map(|cls| cls.slots.descr_get.load());
|
||||
if let Some(descr_get) = descr_get {
|
||||
let mcl = mcl.into_owned().into();
|
||||
return descr_get(attr.clone(), Some(zelf.to_owned().into()), Some(mcl), vm);
|
||||
}
|
||||
@@ -681,7 +682,8 @@ impl GetAttr for PyType {
|
||||
let zelf_attr = zelf.get_attr(name);
|
||||
|
||||
if let Some(ref attr) = zelf_attr {
|
||||
if let Some(descr_get) = attr.class().mro_find_map(|cls| cls.slots.descr_get.load()) {
|
||||
let descr_get = attr.class().mro_find_map(|cls| cls.slots.descr_get.load());
|
||||
if let Some(descr_get) = descr_get {
|
||||
drop(mcl);
|
||||
return descr_get(attr.clone(), None, Some(zelf.to_owned().into()), vm);
|
||||
}
|
||||
@@ -745,7 +747,8 @@ impl Callable for PyType {
|
||||
return Ok(obj);
|
||||
}
|
||||
|
||||
if let Some(init_method) = obj.class().mro_find_map(|cls| cls.slots.init.load()) {
|
||||
let init = obj.class().mro_find_map(|cls| cls.slots.init.load());
|
||||
if let Some(init_method) = init {
|
||||
init_method(obj.clone(), args, vm)?;
|
||||
}
|
||||
Ok(obj)
|
||||
|
||||
@@ -84,14 +84,14 @@ where
|
||||
T: TryFromObject,
|
||||
{
|
||||
fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
|
||||
let iterfn;
|
||||
{
|
||||
let iterfn = {
|
||||
let cls = obj.class();
|
||||
iterfn = cls.mro_find_map(|x| x.slots.iter.load());
|
||||
let iterfn = cls.mro_find_map(|x| x.slots.iter.load());
|
||||
if iterfn.is_none() && !cls.has_attr(identifier!(vm, __getitem__)) {
|
||||
return Err(vm.new_type_error(format!("'{}' object is not iterable", cls.name())));
|
||||
}
|
||||
}
|
||||
iterfn
|
||||
};
|
||||
Ok(Self {
|
||||
iterable: obj,
|
||||
iterfn,
|
||||
|
||||
@@ -762,7 +762,8 @@ impl PyObject {
|
||||
}
|
||||
|
||||
// CPython-compatible drop implementation
|
||||
if let Some(slot_del) = self.class().mro_find_map(|cls| cls.slots.del.load()) {
|
||||
let del = self.class().mro_find_map(|cls| cls.slots.del.load());
|
||||
if let Some(slot_del) = del {
|
||||
call_slot_del(self, slot_del)?;
|
||||
}
|
||||
if let Some(wrl) = self.weak_ref_list() {
|
||||
|
||||
@@ -140,7 +140,8 @@ impl PyBuffer {
|
||||
impl TryFromBorrowedObject for PyBuffer {
|
||||
fn try_from_borrowed_object(vm: &VirtualMachine, obj: &PyObject) -> PyResult<Self> {
|
||||
let cls = obj.class();
|
||||
if let Some(f) = cls.mro_find_map(|cls| cls.slots.as_buffer) {
|
||||
let as_buffer = cls.mro_find_map(|cls| cls.slots.as_buffer);
|
||||
if let Some(f) = as_buffer {
|
||||
return f(obj, vm);
|
||||
}
|
||||
Err(vm.new_type_error(format!(
|
||||
|
||||
@@ -146,11 +146,8 @@ impl PyMapping<'_> {
|
||||
}
|
||||
|
||||
pub fn find_methods(obj: &PyObject, vm: &VirtualMachine) -> Option<&'static PyMappingMethods> {
|
||||
if let Some(f) = obj.class().mro_find_map(|cls| cls.slots.as_mapping.load()) {
|
||||
Some(f(obj, vm))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
let as_mapping = obj.class().mro_find_map(|cls| cls.slots.as_mapping.load());
|
||||
as_mapping.map(|f| f(obj, vm))
|
||||
}
|
||||
|
||||
pub fn length_opt(&self, vm: &VirtualMachine) -> Option<PyResult<usize>> {
|
||||
|
||||
@@ -163,9 +163,8 @@ impl<'a> PyNumber<'a> {
|
||||
|
||||
impl PyNumber<'_> {
|
||||
pub fn find_methods(obj: &PyObject, vm: &VirtualMachine) -> Option<&'static PyNumberMethods> {
|
||||
obj.class()
|
||||
.mro_find_map(|x| x.slots.as_number.load())
|
||||
.map(|f| f(obj, vm))
|
||||
let as_number = obj.class().mro_find_map(|x| x.slots.as_number.load());
|
||||
as_number.map(|f| f(obj, vm))
|
||||
}
|
||||
|
||||
pub fn methods(&self) -> &'static PyNumberMethods {
|
||||
|
||||
@@ -145,7 +145,8 @@ impl PySequence<'_> {
|
||||
pub fn find_methods(obj: &PyObject, vm: &VirtualMachine) -> Option<&'static PySequenceMethods> {
|
||||
let cls = obj.class();
|
||||
if !cls.is(vm.ctx.types.dict_type) {
|
||||
if let Some(f) = cls.mro_find_map(|x| x.slots.as_sequence.load()) {
|
||||
let as_sequence = cls.mro_find_map(|x| x.slots.as_sequence.load());
|
||||
if let Some(f) = as_sequence {
|
||||
return Some(f(obj, vm));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user