@@ -85,11 +85,15 @@ cdef class {{name}}Vector:
85
85
self.data.n = 0
86
86
self.data.m = _INIT_VEC_CAP
87
87
self.data.data = <{{arg}}*> malloc(self.data.m * sizeof({{arg}}))
88
+ if not self.data.data:
89
+ raise MemoryError()
88
90
89
91
cdef void resize(self) nogil:
90
- # TODO: handle failure to allocate
91
92
self.data.m = max(self.data.m * 4, _INIT_VEC_CAP)
92
93
self.data.data = <{{arg}}*> realloc(self.data.data, self.data.m * sizeof({{arg}}))
94
+ if not self.data.data:
95
+ with gil:
96
+ raise MemoryError()
93
97
94
98
def __dealloc__(self):
95
99
if self.data is not NULL:
@@ -110,6 +114,7 @@ cdef class {{name}}Vector:
110
114
raise ValueError("Vector.to_array() can only be called once")
111
115
112
116
self.data.data = <{{arg}}*> realloc(self.data.data, self.data.n * sizeof({{arg}}))
117
+ self.data.m = self.data.n
113
118
self.external_view_exists = True
114
119
shape[0] = self.data.n
115
120
ao = cnp.PyArray_SimpleNewFromData(1, shape, {{idtype}}, <void*>self.data.data)
@@ -120,6 +125,8 @@ cdef class {{name}}Vector:
120
125
cdef inline void append(self, {{arg}} x):
121
126
122
127
if needs_resize(self.data):
128
+ if self.external_view_exists:
129
+ raise ValueError("external reference but Vector.resize() needed")
123
130
self.resize()
124
131
125
132
append_data_{{dtype}}(self.data, x)
@@ -145,12 +152,17 @@ cdef class StringVector:
145
152
self.data.n = 0
146
153
self.data.m = _INIT_VEC_CAP
147
154
self.data.data = <char **> malloc(self.data.m * sizeof(char *))
155
+ if not self.data.data:
156
+ raise MemoryError()
148
157
149
158
cdef void resize(self) nogil:
150
159
self.data.m = max(self.data.m * 4, _INIT_VEC_CAP)
151
160
152
161
self.data.data = <char **> realloc(self.data.data,
153
162
self.data.m * sizeof(char *))
163
+ if not self.data.data:
164
+ with gil:
165
+ raise MemoryError()
154
166
155
167
def __dealloc__(self):
156
168
if self.data is not NULL:
@@ -183,6 +195,8 @@ cdef class StringVector:
183
195
cdef inline void append(self, char * x):
184
196
185
197
if needs_resize(self.data):
198
+ if self.external_view_exists:
199
+ raise ValueError("external reference but Vector.resize() needed")
186
200
self.resize()
187
201
188
202
append_data_string(self.data, x)
@@ -208,6 +222,8 @@ cdef class ObjectVector:
208
222
209
223
cdef inline append(self, object o):
210
224
if self.n == self.m:
225
+ if self.external_view_exists:
226
+ raise ValueError("external reference but Vector.resize() needed")
211
227
self.m = max(self.m * 2, _INIT_VEC_CAP)
212
228
self.ao.resize(self.m, refcheck=False)
213
229
self.data = <PyObject**> self.ao.data
@@ -219,7 +235,7 @@ cdef class ObjectVector:
219
235
def to_array(self):
220
236
if self.external_view_exists:
221
237
raise ValueError("Vector.to_array() can only be called once")
222
- self.ao.resize(self.n)
238
+ self.ao.resize(self.n, refcheck=False )
223
239
self.m = self.n
224
240
self.external_view_exists = True
225
241
return self.ao
@@ -380,6 +396,7 @@ cdef class {{name}}HashTable(HashTable):
380
396
381
397
if needs_resize(ud):
382
398
uniques.resize()
399
+ ud = uniques.data
383
400
append_data_{{dtype}}(ud, val)
384
401
labels[i] = count
385
402
count += 1
@@ -454,18 +471,21 @@ cdef class {{name}}HashTable(HashTable):
454
471
kh_put_{{dtype}}(self.table, val, &ret)
455
472
if needs_resize(ud):
456
473
uniques.resize()
474
+ ud = uniques.data
457
475
append_data_{{dtype}}(ud, val)
458
476
elif not seen_na:
459
477
seen_na = 1
460
478
if needs_resize(ud):
461
479
uniques.resize()
480
+ ud = uniques.data
462
481
append_data_{{dtype}}(ud, NAN)
463
482
{{else}}
464
483
k = kh_get_{{dtype}}(self.table, val)
465
484
if k == self.table.n_buckets:
466
485
kh_put_{{dtype}}(self.table, val, &ret)
467
486
if needs_resize(ud):
468
487
uniques.resize()
488
+ ud = uniques.data
469
489
append_data_{{dtype}}(ud, val)
470
490
{{endif}}
471
491
0 commit comments