Skip to content

Commit 434f1e0

Browse files
committed
FIX: 'parser_trim_buffers' properly initializes word pointers
1 parent a3cddfa commit 434f1e0

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

pandas/src/parser/tokenizer.c

+30-14
Original file line numberDiff line numberDiff line change
@@ -1221,20 +1221,7 @@ int parser_trim_buffers(parser_t *self) {
12211221
size_t new_cap;
12221222
void *newptr;
12231223

1224-
/* trim stream */
1225-
new_cap = _next_pow2(self->stream_len) + 1;
1226-
TRACE(("parser_trim_buffers: new_cap = %zu, stream_cap = %zu, lines_cap = %zu\n",
1227-
new_cap, self->stream_cap, self->lines_cap));
1228-
if (new_cap < self->stream_cap) {
1229-
TRACE(("parser_trim_buffers: new_cap < self->stream_cap, calling safe_realloc\n"));
1230-
newptr = safe_realloc((void*) self->stream, new_cap);
1231-
if (newptr == NULL) {
1232-
return PARSER_OUT_OF_MEMORY;
1233-
} else {
1234-
self->stream = newptr;
1235-
self->stream_cap = new_cap;
1236-
}
1237-
}
1224+
int i;
12381225

12391226
/* trim words, word_starts */
12401227
new_cap = _next_pow2(self->words_len) + 1;
@@ -1255,6 +1242,35 @@ int parser_trim_buffers(parser_t *self) {
12551242
}
12561243
}
12571244

1245+
/* trim stream */
1246+
new_cap = _next_pow2(self->stream_len) + 1;
1247+
TRACE(("parser_trim_buffers: new_cap = %zu, stream_cap = %zu, lines_cap = %zu\n",
1248+
new_cap, self->stream_cap, self->lines_cap));
1249+
if (new_cap < self->stream_cap) {
1250+
TRACE(("parser_trim_buffers: new_cap < self->stream_cap, calling safe_realloc\n"));
1251+
newptr = safe_realloc((void*) self->stream, new_cap);
1252+
if (newptr == NULL) {
1253+
return PARSER_OUT_OF_MEMORY;
1254+
} else {
1255+
// realloc sets errno when moving buffer?
1256+
if (self->stream != newptr) {
1257+
// uff
1258+
/* TRACE(("Moving word pointers\n")) */
1259+
1260+
self->pword_start = newptr + self->word_start;
1261+
1262+
for (i = 0; i < self->words_len; ++i)
1263+
{
1264+
self->words[i] = newptr + self->word_starts[i];
1265+
}
1266+
}
1267+
1268+
self->stream = newptr;
1269+
self->stream_cap = new_cap;
1270+
1271+
}
1272+
}
1273+
12581274
/* trim line_start, line_fields */
12591275
new_cap = _next_pow2(self->lines) + 1;
12601276
if (new_cap < self->lines_cap) {

0 commit comments

Comments
 (0)