Skip to content
Closed
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
Prev Previous commit
Next Next commit
slot inheritance
  • Loading branch information
youknowone committed May 25, 2022
commit 1ca918b769cbe48557ff233e47e48c0324880315
5 changes: 1 addition & 4 deletions vm/src/builtins/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,7 @@ impl PyBaseObject {
}
}
PyComparisonOp::Ne => {
let cmp = zelf
.class()
.mro_find_map(|cls| cls.slots.richcompare.load())
.unwrap();
let cmp = zelf.class().slots.richcompare.load().unwrap();
let value = match cmp(zelf, other, PyComparisonOp::Eq, vm)? {
Either::A(obj) => PyArithmeticValue::from_object(vm, obj)
.map(|obj| obj.try_to_bool(vm))
Expand Down
26 changes: 10 additions & 16 deletions vm/src/builtins/type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -638,11 +638,8 @@ impl GetAttr for PyType {

if let Some(ref attr) = mcl_attr {
let attr_class = attr.class();
if 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()) {
if attr_class.slots.descr_set.load().is_some() {
if let Some(descr_get) = attr_class.slots.descr_get.load() {
let mcl = mcl.into_owned().into();
return descr_get(attr.clone(), Some(zelf.to_owned().into()), Some(mcl), vm);
}
Expand All @@ -652,7 +649,7 @@ 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()) {
if let Some(descr_get) = attr.class().slots.descr_get.load() {
drop(mcl);
return descr_get(attr.clone(), None, Some(zelf.to_owned().into()), vm);
}
Expand Down Expand Up @@ -681,7 +678,7 @@ impl SetAttr for PyType {
vm: &VirtualMachine,
) -> PyResult<()> {
if let Some(attr) = zelf.get_class_attr(attr_name.as_str()) {
let descr_set = attr.class().mro_find_map(|cls| cls.slots.descr_set.load());
let descr_set = attr.class().slots.descr_set.load();
if let Some(descriptor) = descr_set {
return descriptor(attr, zelf.to_owned().into(), value, vm);
}
Expand Down Expand Up @@ -758,15 +755,12 @@ fn subtype_set_dict(obj: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -
let cls = obj.class().clone();
match find_base_dict_descr(&cls, vm) {
Some(descr) => {
let descr_set = descr
.class()
.mro_find_map(|cls| cls.slots.descr_set.load())
.ok_or_else(|| {
vm.new_type_error(format!(
"this __dict__ descriptor does not support '{}' objects",
cls.name()
))
})?;
let descr_set = descr.class().slots.descr_set.load().ok_or_else(|| {
vm.new_type_error(format!(
"this __dict__ descriptor does not support '{}' objects",
cls.name()
))
})?;
descr_set(descr, obj, Some(value), vm)
}
None => {
Expand Down
9 changes: 3 additions & 6 deletions vm/src/protocol/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ impl PyObject {
vm_trace!("object.__setattr__({:?}, {}, {:?})", obj, attr_name, value);

if let Some(attr) = self.get_class_attr(attr_name.as_str()) {
let descr_set = attr.class().mro_find_map(|cls| cls.slots.descr_set.load());
let descr_set = attr.class().slots.descr_set.load();
if let Some(descriptor) = descr_set {
return descriptor(attr, self.to_owned(), value, vm);
}
Expand Down Expand Up @@ -194,12 +194,9 @@ impl PyObject {
let cls_attr = match obj_cls.get_attr(name) {
Some(descr) => {
let descr_cls = descr.class();
let descr_get = descr_cls.mro_find_map(|cls| cls.slots.descr_get.load());
let descr_get = descr_cls.slots.descr_get.load();
if let Some(descr_get) = descr_get {
if descr_cls
.mro_find_map(|cls| cls.slots.descr_set.load())
.is_some()
{
if descr_cls.slots.descr_set.load().is_some() {
drop(descr_cls);
let cls = obj_cls.into_owned().into();
return descr_get(descr, Some(self.to_owned()), Some(cls), vm).map(Some);
Expand Down
12 changes: 3 additions & 9 deletions vm/src/sequence.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,7 @@ pub trait MutObjectSequenceOp<'a> {
F: FnMut(),
{
let needle_cls = needle.class();
let needle_cmp = needle_cls
.mro_find_map(|cls| cls.slots.richcompare.load())
.unwrap();
let needle_cmp = needle_cls.slots.richcompare.load().unwrap();

let mut borrower = None;
let mut i = range.start;
Expand Down Expand Up @@ -146,9 +144,7 @@ pub trait MutObjectSequenceOp<'a> {
!elem_cls.is(&needle_cls) && elem_cls.fast_issubclass(&needle_cls);

let eq = if reverse_first {
let elem_cmp = elem_cls
.mro_find_map(|cls| cls.slots.richcompare.load())
.unwrap();
let elem_cmp = elem_cls.slots.richcompare.load().unwrap();
drop(elem_cls);

fn cmp(
Expand Down Expand Up @@ -195,9 +191,7 @@ pub trait MutObjectSequenceOp<'a> {
obj.try_to_bool(vm)?
}
_ => {
let elem_cmp = elem_cls
.mro_find_map(|cls| cls.slots.richcompare.load())
.unwrap();
let elem_cmp = elem_cls.slots.richcompare.load().unwrap();
drop(elem_cls);

fn cmp(
Expand Down
7 changes: 2 additions & 5 deletions vm/src/vm/method.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,9 @@ impl PyMethod {
is_method = true;
None
} else {
let descr_get = descr_cls.mro_find_map(|cls| cls.slots.descr_get.load());
let descr_get = descr_cls.slots.descr_get.load();
if let Some(descr_get) = descr_get {
if descr_cls
.mro_find_map(|cls| cls.slots.descr_set.load())
.is_some()
{
if descr_cls.slots.descr_set.load().is_some() {
drop(descr_cls);
let cls = cls.into_owned().into();
return descr_get(descr, Some(obj), Some(cls), vm).map(Self::Attribute);
Expand Down
2 changes: 1 addition & 1 deletion vm/src/vm/vm_object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ impl VirtualMachine {
obj: Option<PyObjectRef>,
cls: Option<PyObjectRef>,
) -> Result<PyResult, PyObjectRef> {
let descr_get = descr.class().mro_find_map(|cls| cls.slots.descr_get.load());
let descr_get = descr.class().slots.descr_get.load();
match descr_get {
Some(descr_get) => Ok(descr_get(descr, obj, cls, self)),
None => Err(descr),
Expand Down