Fix slot call deadlock

This commit is contained in:
Jeong Yunwon committed 2022-06-16 20:53:59 +09:00
1 parent 60598b699e
commit 770f166edf
7 files changed
+23 -21

No files matched your search

+9 -6
View File
@@ -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)
+4 -4
View File
@@ -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,
+2 -1
View File
@@ -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() {
+2 -1
View File
@@ -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!(
+2 -5
View File
@@ -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>> {
+2 -3
View File
@@ -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 {
+2 -1
View File
@@ -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));
}
}