Skip to content

Commit 8e45dad

Browse files
Generate exception from the C code in the proper manner
Get rid of all error printf's and produce proper Python exceptions
1 parent 5da500a commit 8e45dad

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

pandas/_libs/parsers.pyx

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ cdef extern from "parser/io.h":
241241
void* buffer_mmap_bytes(void *source, size_t nbytes,
242242
size_t *bytes_read, int *status)
243243

244-
void *new_file_source(char *fname, size_t buffer_size)
244+
void *new_file_source(char *fname, size_t buffer_size) except NULL
245245

246246
void *new_rd_source(object obj)
247247

@@ -667,16 +667,6 @@ cdef class TextReader:
667667
ptr = new_file_source(source, self.parser.chunksize)
668668
self.parser.cb_io = &buffer_file_bytes
669669
self.parser.cb_cleanup = &del_file_source
670-
671-
if ptr == NULL:
672-
if not os.path.exists(source):
673-
674-
raise FileNotFoundError(
675-
ENOENT,
676-
f'File {usource} does not exist',
677-
usource)
678-
raise IOError('Initializing from file failed')
679-
680670
self.parser.source = ptr
681671

682672
elif hasattr(source, 'read'):

pandas/_libs/src/parser/io.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ The full license is in the LICENSE file, distributed with this software.
2828
void *new_file_source(char *fname, size_t buffer_size) {
2929
file_source *fs = (file_source *)malloc(sizeof(file_source));
3030
if (fs == NULL) {
31+
PyErr_NoMemory();
3132
return NULL;
3233
}
3334

@@ -41,17 +42,20 @@ void *new_file_source(char *fname, size_t buffer_size) {
4142
int required = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0);
4243
if (required == 0) {
4344
free(fs);
45+
PyErr_SetFromWindowsErr(GetLastError())
4446
return NULL;
4547
}
4648
wname = (wchar_t*)malloc(required * sizeof(wchar_t));
4749
if (wname == NULL) {
4850
free(fs);
51+
PyErr_NoMemory();
4952
return NULL;
5053
}
5154
if (MultiByteToWideChar(CP_UTF8, 0, fname, -1, wname, required) <
5255
required) {
5356
free(wname);
5457
free(fs);
58+
PyErr_SetFromWindowsErr(GetLastError())
5559
return NULL;
5660
}
5761
fs->fd = _wopen(wname, O_RDONLY | O_BINARY);
@@ -62,6 +66,11 @@ void *new_file_source(char *fname, size_t buffer_size) {
6266
#endif
6367
if (fs->fd == -1) {
6468
free(fs);
69+
#ifdef USE_WIN_UTF16
70+
PyErr_SetFromWindowsErr(GetLastError())
71+
#else
72+
PyErr_SetFromErrnoWithFilename(PyExc_OSError, fname);
73+
#endif
6574
return NULL;
6675
}
6776

@@ -71,6 +80,7 @@ void *new_file_source(char *fname, size_t buffer_size) {
7180
if (fs->buffer == NULL) {
7281
close(fs->fd);
7382
free(fs);
83+
PyErr_NoMemory();
7484
return NULL;
7585
}
7686

@@ -83,6 +93,10 @@ void *new_file_source(char *fname, size_t buffer_size) {
8393
void *new_rd_source(PyObject *obj) {
8494
rd_source *rds = (rd_source *)malloc(sizeof(rd_source));
8595

96+
if (rds == NULL) {
97+
PyErr_NoMemory();
98+
return NULL;
99+
}
86100
/* hold on to this object */
87101
Py_INCREF(obj);
88102
rds->obj = obj;
@@ -220,20 +234,18 @@ void *new_mmap(char *fname) {
220234

221235
mm = (memory_map *)malloc(sizeof(memory_map));
222236
if (mm == NULL) {
223-
fprintf(stderr, "new_file_buffer: malloc() failed.\n");
224-
return (NULL);
237+
PyErr_NoMemory();
238+
return NULL;
225239
}
226240
mm->fd = open(fname, O_RDONLY | O_BINARY);
227241
if (mm->fd == -1) {
228-
fprintf(stderr, "new_file_buffer: open(%s) failed. errno =%d\n",
229-
fname, errno);
242+
PyErr_SetFromErrnoWithFilename(PyExc_OSError, fname);
230243
free(mm);
231244
return NULL;
232245
}
233246

234247
if (fstat(mm->fd, &stat) == -1) {
235-
fprintf(stderr, "new_file_buffer: fstat() failed. errno =%d\n",
236-
errno);
248+
PyErr_SetFromErrnoWithFilename(PyExc_OSError, fname);
237249
close(mm->fd);
238250
free(mm);
239251
return NULL;
@@ -242,8 +254,7 @@ void *new_mmap(char *fname) {
242254

243255
mm->memmap = mmap(NULL, filesize, PROT_READ, MAP_SHARED, mm->fd, 0);
244256
if (mm->memmap == MAP_FAILED) {
245-
/* XXX Eventually remove this print statement. */
246-
fprintf(stderr, "new_file_buffer: mmap() failed.\n");
257+
PyErr_SetFromErrnoWithFilename(PyExc_OSError, fname);
247258
close(mm->fd);
248259
free(mm);
249260
return NULL;

0 commit comments

Comments
 (0)