diff options
author | Damien George <damien.p.george@gmail.com> | 2016-10-24 12:59:20 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-10-24 12:59:20 +1100 |
commit | 56942019309645781d330312f5944db2d4cb5cd7 (patch) | |
tree | f5410a2c3d933dad4b1423ec093fe97f70bd5607 | |
parent | 06e703290640ed6326bf70e172c25be92799591f (diff) | |
download | micropython-56942019309645781d330312f5944db2d4cb5cd7.tar.gz micropython-56942019309645781d330312f5944db2d4cb5cd7.zip |
extmod/vfs_fat_file: Make file.close() a no-op if file already closed.
As per CPython semantics. In particular, file.__del__() should not raise
an exception if the file is already closed.
-rw-r--r-- | extmod/vfs_fat_file.c | 9 | ||||
-rw-r--r-- | tests/extmod/vfs_fat_fileio.py | 6 | ||||
-rw-r--r-- | tests/extmod/vfs_fat_fileio.py.exp | 1 |
3 files changed, 7 insertions, 9 deletions
diff --git a/extmod/vfs_fat_file.c b/extmod/vfs_fat_file.c index e269ef593c..76ac23685a 100644 --- a/extmod/vfs_fat_file.c +++ b/extmod/vfs_fat_file.c @@ -120,9 +120,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_flush_obj, file_obj_flush); STATIC mp_obj_t file_obj_close(mp_obj_t self_in) { pyb_file_obj_t *self = MP_OBJ_TO_PTR(self_in); - FRESULT res = f_close(&self->fp); - if (res != FR_OK) { - mp_raise_OSError(fresult_to_errno_table[res]); + // if fs==NULL then the file is closed and in that case this method is a no-op + if (self->fp.fs != NULL) { + FRESULT res = f_close(&self->fp); + if (res != FR_OK) { + mp_raise_OSError(fresult_to_errno_table[res]); + } } return mp_const_none; } diff --git a/tests/extmod/vfs_fat_fileio.py b/tests/extmod/vfs_fat_fileio.py index 26fec78281..de8d4953c4 100644 --- a/tests/extmod/vfs_fat_fileio.py +++ b/tests/extmod/vfs_fat_fileio.py @@ -48,6 +48,7 @@ print(str(f)[:17], str(f)[-1:]) f.write("hello!") f.flush() f.close() +f.close() # allowed try: f.write("world!") except OSError as e: @@ -64,11 +65,6 @@ except OSError as e: print(e.args[0] == uerrno.EINVAL) try: - f.close() -except OSError as e: - print(e.args[0] == uerrno.EINVAL) - -try: vfs.open("foo_file.txt", "x") except OSError as e: print(e.args[0] == uerrno.EEXIST) diff --git a/tests/extmod/vfs_fat_fileio.py.exp b/tests/extmod/vfs_fat_fileio.py.exp index 9f0edb31ef..c438bc850c 100644 --- a/tests/extmod/vfs_fat_fileio.py.exp +++ b/tests/extmod/vfs_fat_fileio.py.exp @@ -3,7 +3,6 @@ True True True True -True hello!world! 12 h |