Skip to content
This repository was archived by the owner on Jun 27, 2025. It is now read-only.

Commit f30dec9

Browse files
authored
Merge pull request #13 from static-frame/12/win-access-violation
Windows fatal exception: access violation
2 parents 5fe8678 + d3d4b46 commit f30dec9

2 files changed

Lines changed: 48 additions & 7 deletions

File tree

arraymap.c

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,12 @@ insert_int(
12391239
return -1;
12401240
}
12411241
if (self->table[table_pos].hash != -1) {
1242-
PyErr_SetObject(NonUniqueError, PyLong_FromSsize_t(key));
1242+
PyObject* er = PyLong_FromLongLong(key); // for error reporting
1243+
if (er == NULL) {
1244+
return -1;
1245+
}
1246+
PyErr_SetObject(NonUniqueError, er);
1247+
Py_DECREF(er);
12431248
return -1;
12441249
}
12451250
self->table[table_pos].keys_pos = keys_pos;
@@ -1264,7 +1269,12 @@ insert_uint(
12641269
return -1;
12651270
}
12661271
if (self->table[table_pos].hash != -1) {
1267-
PyErr_SetObject(NonUniqueError, PyLong_FromSsize_t(key));
1272+
PyObject* er = PyLong_FromUnsignedLongLong(key);
1273+
if (er == NULL) {
1274+
return -1;
1275+
}
1276+
PyErr_SetObject(NonUniqueError, er);
1277+
Py_DECREF(er);
12681278
return -1;
12691279
}
12701280
self->table[table_pos].keys_pos = keys_pos;
@@ -1290,7 +1300,12 @@ insert_double(
12901300
return -1;
12911301
}
12921302
if (self->table[table_pos].hash != -1) {
1293-
PyErr_SetObject(NonUniqueError, PyFloat_FromDouble(key));
1303+
PyObject* er = PyFloat_FromDouble(key);
1304+
if (er == NULL) {
1305+
return -1;
1306+
}
1307+
PyErr_SetObject(NonUniqueError, er);
1308+
Py_DECREF(er);
12941309
return -1;
12951310
}
12961311
self->table[table_pos].keys_pos = keys_pos;
@@ -1316,8 +1331,12 @@ insert_unicode(
13161331
return -1;
13171332
}
13181333
if (self->table[table_pos].hash != -1) {
1319-
PyErr_SetObject(NonUniqueError,
1320-
PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, key, key_size));
1334+
PyObject* er = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, key, key_size);
1335+
if (er == NULL) {
1336+
return -1;
1337+
}
1338+
PyErr_SetObject(NonUniqueError, er);
1339+
Py_DECREF(er);
13211340
return -1;
13221341
}
13231342
self->table[table_pos].keys_pos = keys_pos;
@@ -1343,8 +1362,12 @@ insert_string(
13431362
return -1;
13441363
}
13451364
if (self->table[table_pos].hash != -1) {
1346-
PyErr_SetObject(NonUniqueError,
1347-
PyBytes_FromStringAndSize(key, key_size));
1365+
PyObject* er = PyBytes_FromStringAndSize(key, key_size);
1366+
if (er == NULL) {
1367+
return -1;
1368+
}
1369+
PyErr_SetObject(NonUniqueError, er);
1370+
Py_DECREF(er);
13481371
return -1;
13491372
}
13501373
self->table[table_pos].keys_pos = keys_pos;
@@ -1947,6 +1970,7 @@ fam_init(PyObject *self, PyObject *args, PyObject *kwargs)
19471970
}
19481971
return 0;
19491972
error:
1973+
// assume all dynamic memory assigned to struct attrs that will be cleaned
19501974
return -1;
19511975
}
19521976

test/test_unit.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,23 @@ def test_fam_constructor_array_int_d():
9292
assert k in fam
9393

9494

95+
def test_fam_constructor_array_int_e():
96+
# https://github.com/static-frame/arraymap/issues/12
97+
a1 = np.array((0, 0, 1, 1, 2, 2), dtype=int)
98+
a2 = a1[[0, 2, 4]]
99+
a2.flags.writeable = False
100+
fam1 = FrozenAutoMap(a2)
101+
assert list(fam1) == [0, 1, 2]
102+
103+
d1 = {i: int(i) for i in a2}
104+
fam2 = FrozenAutoMap(d1)
105+
assert list(fam2) == [0, 1, 2]
106+
107+
d2 = {0: 0, 3: 1}
108+
fam3 = FrozenAutoMap(d2)
109+
assert list(fam3) == [0, 3]
110+
111+
95112
# ------------------------------------------------------------------------------
96113

97114

0 commit comments

Comments
 (0)