Skip to content

Commit c4ebaa8

Browse files
committed
IO Desctructors
1 parent 8c0f2d9 commit c4ebaa8

File tree

1 file changed

+77
-5
lines changed
  • crates/vm/src/stdlib

1 file changed

+77
-5
lines changed

crates/vm/src/stdlib/io.rs

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,11 +1753,23 @@ mod _io {
17531753
}
17541754

17551755
#[pyclass(
1756-
with(Constructor, BufferedMixin, BufferedReadable),
1756+
with(Constructor, BufferedMixin, BufferedReadable, Destructor),
17571757
flags(BASETYPE, HAS_DICT)
17581758
)]
17591759
impl BufferedReader {}
17601760

1761+
impl Destructor for BufferedReader {
1762+
fn slot_del(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<()> {
1763+
let _ = vm.call_method(zelf, "close", ());
1764+
Ok(())
1765+
}
1766+
1767+
#[cold]
1768+
fn del(_zelf: &Py<Self>, _vm: &VirtualMachine) -> PyResult<()> {
1769+
unreachable!("slot_del is implemented")
1770+
}
1771+
}
1772+
17611773
impl DefaultConstructor for BufferedReader {}
17621774

17631775
#[pyclass]
@@ -1810,11 +1822,23 @@ mod _io {
18101822
}
18111823

18121824
#[pyclass(
1813-
with(Constructor, BufferedMixin, BufferedWritable),
1825+
with(Constructor, BufferedMixin, BufferedWritable, Destructor),
18141826
flags(BASETYPE, HAS_DICT)
18151827
)]
18161828
impl BufferedWriter {}
18171829

1830+
impl Destructor for BufferedWriter {
1831+
fn slot_del(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<()> {
1832+
let _ = vm.call_method(zelf, "close", ());
1833+
Ok(())
1834+
}
1835+
1836+
#[cold]
1837+
fn del(_zelf: &Py<Self>, _vm: &VirtualMachine) -> PyResult<()> {
1838+
unreachable!("slot_del is implemented")
1839+
}
1840+
}
1841+
18181842
impl DefaultConstructor for BufferedWriter {}
18191843

18201844
#[pyattr]
@@ -1852,11 +1876,29 @@ mod _io {
18521876
}
18531877

18541878
#[pyclass(
1855-
with(Constructor, BufferedMixin, BufferedReadable, BufferedWritable),
1879+
with(
1880+
Constructor,
1881+
BufferedMixin,
1882+
BufferedReadable,
1883+
BufferedWritable,
1884+
Destructor
1885+
),
18561886
flags(BASETYPE, HAS_DICT)
18571887
)]
18581888
impl BufferedRandom {}
18591889

1890+
impl Destructor for BufferedRandom {
1891+
fn slot_del(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<()> {
1892+
let _ = vm.call_method(zelf, "close", ());
1893+
Ok(())
1894+
}
1895+
1896+
#[cold]
1897+
fn del(_zelf: &Py<Self>, _vm: &VirtualMachine) -> PyResult<()> {
1898+
unreachable!("slot_del is implemented")
1899+
}
1900+
}
1901+
18601902
impl DefaultConstructor for BufferedRandom {}
18611903

18621904
#[pyattr]
@@ -1900,7 +1942,13 @@ mod _io {
19001942
}
19011943

19021944
#[pyclass(
1903-
with(Constructor, Initializer, BufferedReadable, BufferedWritable),
1945+
with(
1946+
Constructor,
1947+
Initializer,
1948+
BufferedReadable,
1949+
BufferedWritable,
1950+
Destructor
1951+
),
19041952
flags(BASETYPE, HAS_DICT)
19051953
)]
19061954
impl BufferedRWPair {
@@ -1942,6 +1990,18 @@ mod _io {
19421990
}
19431991
}
19441992

1993+
impl Destructor for BufferedRWPair {
1994+
fn slot_del(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<()> {
1995+
let _ = vm.call_method(zelf, "close", ());
1996+
Ok(())
1997+
}
1998+
1999+
#[cold]
2000+
fn del(_zelf: &Py<Self>, _vm: &VirtualMachine) -> PyResult<()> {
2001+
unreachable!("slot_del is implemented")
2002+
}
2003+
}
2004+
19452005
#[derive(FromArgs)]
19462006
struct TextIOWrapperArgs {
19472007
#[pyarg(any, default)]
@@ -2413,7 +2473,7 @@ mod _io {
24132473
vm.call_method(&textio.buffer, "flush", ())
24142474
}
24152475

2416-
#[pyclass(with(Constructor, Initializer), flags(BASETYPE))]
2476+
#[pyclass(with(Constructor, Initializer, Destructor), flags(BASETYPE))]
24172477
impl TextIOWrapper {
24182478
#[pymethod]
24192479
fn reconfigure(&self, args: TextIOWrapperArgs, vm: &VirtualMachine) -> PyResult<()> {
@@ -3276,6 +3336,18 @@ mod _io {
32763336
}
32773337
}
32783338

3339+
impl Destructor for TextIOWrapper {
3340+
fn slot_del(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<()> {
3341+
let _ = vm.call_method(zelf, "close", ());
3342+
Ok(())
3343+
}
3344+
3345+
#[cold]
3346+
fn del(_zelf: &Py<Self>, _vm: &VirtualMachine) -> PyResult<()> {
3347+
unreachable!("slot_del is implemented")
3348+
}
3349+
}
3350+
32793351
#[pyattr]
32803352
#[pyclass(name)]
32813353
#[derive(Debug, PyPayload, Default)]

0 commit comments

Comments
 (0)