Skip to content

Commit 31c8872

Browse files
committed
Refactor PySet with try_set_inner!
1 parent 89729c3 commit 31c8872

1 file changed

Lines changed: 20 additions & 50 deletions

File tree

vm/src/obj/objset.rs

Lines changed: 20 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,16 @@ impl PySetInner {
303303
}
304304
}
305305

306+
macro_rules! try_set_inner {
307+
($vm:expr, $other:expr, $op:expr) => {
308+
match_class!($other,
309+
set @ PySet => $op(&*set.inner.borrow()),
310+
frozen @ PyFrozenSet => $op(&frozen.inner),
311+
other => Err($vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class()))),
312+
);
313+
};
314+
}
315+
306316
#[pyimpl]
307317
impl PySet {
308318
#[pymethod(name = "__new__")]
@@ -336,47 +346,27 @@ impl PySet {
336346

337347
#[pymethod(name = "__eq__")]
338348
fn eq(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
339-
match_class!(other,
340-
set @ PySet => self.inner.borrow().eq(&set.inner.borrow(), vm),
341-
frozen @ PyFrozenSet => self.inner.borrow().eq(&frozen.inner, vm),
342-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
343-
)
349+
try_set_inner!(vm, other, |other| self.inner.borrow().eq(other, vm))
344350
}
345351

346352
#[pymethod(name = "__ge__")]
347353
fn ge(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
348-
match_class!(other,
349-
set @ PySet => self.inner.borrow().ge(&set.inner.borrow(), vm),
350-
frozen @ PyFrozenSet => self.inner.borrow().ge(&frozen.inner, vm),
351-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
352-
)
354+
try_set_inner!(vm, other, |other| self.inner.borrow().ge(other, vm))
353355
}
354356

355357
#[pymethod(name = "__gt__")]
356358
fn gt(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
357-
match_class!(other,
358-
set @ PySet => self.inner.borrow().gt(&set.inner.borrow(), vm),
359-
frozen @ PyFrozenSet => self.inner.borrow().gt(&frozen.inner, vm),
360-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
361-
)
359+
try_set_inner!(vm, other, |other| self.inner.borrow().gt(other, vm))
362360
}
363361

364362
#[pymethod(name = "__le__")]
365363
fn le(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
366-
match_class!(other,
367-
set @ PySet => self.inner.borrow().le(&set.inner.borrow(), vm),
368-
frozen @ PyFrozenSet => self.inner.borrow().le(&frozen.inner, vm),
369-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
370-
)
364+
try_set_inner!(vm, other, |other| self.inner.borrow().le(other, vm))
371365
}
372366

373367
#[pymethod(name = "__lt__")]
374368
fn lt(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
375-
match_class!(other,
376-
set @ PySet => self.inner.borrow().lt(&set.inner.borrow(), vm),
377-
frozen @ PyFrozenSet => self.inner.borrow().lt(&frozen.inner, vm),
378-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
379-
)
369+
try_set_inner!(vm, other, |other| self.inner.borrow().lt(other, vm))
380370
}
381371

382372
#[pymethod]
@@ -598,47 +588,27 @@ impl PyFrozenSet {
598588

599589
#[pymethod(name = "__eq__")]
600590
fn eq(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
601-
match_class!(other,
602-
set @ PySet => self.inner.eq(&set.inner.borrow(), vm),
603-
frozen @ PyFrozenSet => self.inner.eq(&frozen.inner, vm),
604-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
605-
)
591+
try_set_inner!(vm, other, |other| self.inner.eq(other, vm))
606592
}
607593

608594
#[pymethod(name = "__ge__")]
609595
fn ge(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
610-
match_class!(other,
611-
set @ PySet => self.inner.ge(&set.inner.borrow(), vm),
612-
frozen @ PyFrozenSet => self.inner.ge(&frozen.inner, vm),
613-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
614-
)
596+
try_set_inner!(vm, other, |other| self.inner.ge(other, vm))
615597
}
616598

617599
#[pymethod(name = "__gt__")]
618600
fn gt(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
619-
match_class!(other,
620-
set @ PySet => self.inner.gt(&set.inner.borrow(), vm),
621-
frozen @ PyFrozenSet => self.inner.gt(&frozen.inner, vm),
622-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
623-
)
601+
try_set_inner!(vm, other, |other| self.inner.gt(other, vm))
624602
}
625603

626604
#[pymethod(name = "__le__")]
627605
fn le(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
628-
match_class!(other,
629-
set @ PySet => self.inner.le(&set.inner.borrow(), vm),
630-
frozen @ PyFrozenSet => self.inner.le(&frozen.inner, vm),
631-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
632-
)
606+
try_set_inner!(vm, other, |other| self.inner.le(other, vm))
633607
}
634608

635609
#[pymethod(name = "__lt__")]
636610
fn lt(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
637-
match_class!(other,
638-
set @ PySet => self.inner.lt(&set.inner.borrow(), vm),
639-
frozen @ PyFrozenSet => self.inner.lt(&frozen.inner, vm),
640-
other => {return Err(vm.new_type_error(format!("{} is not a subtype of set or frozenset", other.class())));},
641-
)
611+
try_set_inner!(vm, other, |other| self.inner.lt(other, vm))
642612
}
643613

644614
#[pymethod]

0 commit comments

Comments
 (0)