Skip to content

Commit 10d2c93

Browse files
committed
Merge pull request #6 from mdboom/attached-files
Properly manage the lifetime of attached files
2 parents 8286fba + feb7810 commit 10d2c93

File tree

2 files changed

+42
-35
lines changed

2 files changed

+42
-35
lines changed

src/face.c

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static unsigned long read_from_file_callback(
7474
FT_Stream stream, unsigned long offset, unsigned char *buffer,
7575
unsigned long count) {
7676

77-
Py_Face *self = (Py_Face *)stream->descriptor.pointer;
77+
Py_Face_Stream_Meta *self = (Py_Face_Stream_Meta *)stream->descriptor.pointer;
7878

7979
if (ftpy_fseek(self->fp, offset, SEEK_SET) == -1) {
8080
return 0;
@@ -90,7 +90,7 @@ static unsigned long read_from_file_callback(
9090

9191
static void close_file_callback(FT_Stream stream)
9292
{
93-
Py_Face *self = (Py_Face *)stream->descriptor.pointer;
93+
Py_Face_Stream_Meta *self = (Py_Face_Stream_Meta *)stream->descriptor.pointer;
9494

9595
ftpy_PyFile_DupClose(self->py_file, self->fp, self->offset);
9696

@@ -111,7 +111,7 @@ static void close_file_callback(FT_Stream stream)
111111
static int _py_file_to_open_args(
112112
PyObject *py_file_arg,
113113
FT_Open_Args *open_args,
114-
Py_Face *face)
114+
Py_Face_Stream_Meta *meta)
115115
{
116116
PyObject *py_file = NULL;
117117
int close_file = 0;
@@ -140,23 +140,23 @@ static int _py_file_to_open_args(
140140

141141
if ((fp = ftpy_PyFile_Dup(py_file, (char *)"rb", &offset))) {
142142
Py_INCREF(py_file);
143-
face->py_file = py_file;
144-
face->close_file = close_file;
145-
face->fp = fp;
146-
face->offset = offset;
143+
meta->py_file = py_file;
144+
meta->close_file = close_file;
145+
meta->fp = fp;
146+
meta->offset = offset;
147147
fseek(fp, 0, SEEK_END);
148148
file_size = ftpy_ftell(fp);
149149
fseek(fp, 0, SEEK_SET);
150150

151-
face->stream.base = NULL;
152-
face->stream.size = (unsigned long)file_size;
153-
face->stream.pos = 0;
154-
face->stream.descriptor.pointer = face;
155-
face->stream.read = &read_from_file_callback;
156-
face->stream.close = &close_file_callback;
151+
meta->stream.base = NULL;
152+
meta->stream.size = (unsigned long)file_size;
153+
meta->stream.pos = 0;
154+
meta->stream.descriptor.pointer = meta;
155+
meta->stream.read = &read_from_file_callback;
156+
meta->stream.close = &close_file_callback;
157157

158158
open_args->flags = FT_OPEN_STREAM;
159-
open_args->stream = &face->stream;
159+
open_args->stream = &meta->stream;
160160

161161
result = 0;
162162
goto exit;
@@ -179,15 +179,15 @@ static int _py_file_to_open_args(
179179
goto exit;
180180
}
181181

182-
if (face->mem) {
183-
free(face->mem);
182+
if (meta->mem) {
183+
free(meta->mem);
184184
}
185-
face->mem = PyMem_Malloc(face->mem_size + data_len);
186-
if (face->mem == NULL) {
185+
meta->mem = PyMem_Malloc(meta->mem_size + data_len);
186+
if (meta->mem == NULL) {
187187
goto exit;
188188
}
189-
new_memory = face->mem + face->mem_size;
190-
face->mem_size += data_len;
189+
new_memory = meta->mem + meta->mem_size;
190+
meta->mem_size += data_len;
191191

192192
memcpy(new_memory, data_ptr, data_len);
193193
open_args->flags = FT_OPEN_MEMORY;
@@ -226,9 +226,11 @@ Py_Face_dealloc(Py_Face* self)
226226
if (self->x) {
227227
FT_Done_Face(self->x);
228228
}
229-
Py_XDECREF(self->py_file);
229+
Py_XDECREF(self->main.py_file);
230+
free(self->main.mem);
231+
Py_XDECREF(self->attach.py_file);
232+
free(self->attach.mem);
230233
Py_XDECREF(self->filename);
231-
free(self->mem);
232234
Py_TYPE(self)->tp_clear((PyObject*)self);
233235
Py_TYPE(self)->tp_free((PyObject*)self);
234236
}
@@ -246,10 +248,10 @@ Py_Face_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
246248
Py_INCREF(freetypy_module);
247249
self->base.owner = freetypy_module;
248250
self->x = NULL;
249-
memset(&self->stream, 0, sizeof(FT_StreamRec));
250-
self->mem = NULL;
251-
self->mem_size = 0;
251+
self->load_flags = 0;
252252
self->filename = NULL;
253+
memset(&self->main, 0, sizeof(Py_Face_Stream_Meta));
254+
memset(&self->attach, 0, sizeof(Py_Face_Stream_Meta));
253255
return (PyObject *)self;
254256
}
255257

@@ -270,7 +272,7 @@ Py_Face_init(Py_Face *self, PyObject *args, PyObject *kwds)
270272
return -1;
271273
}
272274

273-
if (_py_file_to_open_args(py_file_arg, &open_args, self)) {
275+
if (_py_file_to_open_args(py_file_arg, &open_args, &self->main)) {
274276
goto exit;
275277
}
276278

@@ -533,7 +535,7 @@ Py_Face_attach(Py_Face *self, PyObject *args, PyObject *kwds)
533535
return NULL;
534536
}
535537

536-
if (_py_file_to_open_args(py_file_arg, &open_args, self)) {
538+
if (_py_file_to_open_args(py_file_arg, &open_args, &self->attach)) {
537539
return NULL;
538540
}
539541

src/face.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,24 @@ either expressed or implied, of the FreeBSD Project.
3636

3737

3838
typedef struct {
39-
ftpy_Object base;
40-
FT_Face x;
4139
FT_StreamRec stream;
42-
void *mem;
43-
size_t mem_size;
44-
PyObject *filename;
45-
int load_flags;
46-
47-
/* For stream reading */
4840
PyObject *py_file;
4941
FILE *fp;
5042
int close_file;
5143
ftpy_offset_t offset;
44+
void *mem;
45+
size_t mem_size;
46+
} Py_Face_Stream_Meta;
47+
48+
49+
typedef struct {
50+
ftpy_Object base;
51+
FT_Face x;
52+
int load_flags;
53+
PyObject *filename;
54+
55+
Py_Face_Stream_Meta main;
56+
Py_Face_Stream_Meta attach;
5257
} Py_Face;
5358

5459

0 commit comments

Comments
 (0)