Skip to content

Commit 03fd2f8

Browse files
committed
Sequence methods, fix concat test.
1 parent 9301a58 commit 03fd2f8

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

src/cpy/Object/cSeqObject.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,13 @@ static PyMethodDef SequenceLongObject_methods[] = {
8585
/* Sequence methods. */
8686
static Py_ssize_t
8787
SequenceLongObject_sq_length(PyObject *self) {
88-
fprintf(stdout, "%s(): returns=%zd\n", __FUNCTION__, ((SequenceLongObject *) self)->size);
88+
// fprintf(stdout, "%s(%p): returns=%zd\n", __FUNCTION__, (void *) self, ((SequenceLongObject *) self)->size);
8989
return ((SequenceLongObject *) self)->size;
9090
}
9191

9292
// Forward references
9393
static PyTypeObject SequenceLongObjectType;
94+
9495
static int is_sequence_of_long_type(PyObject *op);
9596

9697
/**
@@ -101,6 +102,7 @@ static int is_sequence_of_long_type(PyObject *op);
101102
*/
102103
static PyObject *
103104
SequenceLongObject_sq_concat(PyObject *self, PyObject *other) {
105+
// fprintf(stdout, "%s(%p):\n", __FUNCTION__, (void *) self);
104106
if (!is_sequence_of_long_type(other)) {
105107
PyErr_Format(
106108
PyExc_TypeError,
@@ -110,24 +112,35 @@ SequenceLongObject_sq_concat(PyObject *self, PyObject *other) {
110112
return NULL;
111113
}
112114
PyObject *ret = SequenceLongObject_new(&SequenceLongObjectType, NULL, NULL);
115+
if (!ret) {
116+
assert(PyErr_Occurred());
117+
return NULL;
118+
}
113119
/* For convenience. */
114120
SequenceLongObject *ret_as_slo = (SequenceLongObject *) ret;
115121
ret_as_slo->size = ((SequenceLongObject *) self)->size + ((SequenceLongObject *) other)->size;
116122
ret_as_slo->array_long = malloc(ret_as_slo->size * sizeof(long));
117123
if (!ret_as_slo->array_long) {
118124
PyErr_Format(PyExc_MemoryError, "%s(): Can not create new object.", __FUNCTION__);
125+
Py_DECREF(ret);
126+
return NULL;
119127
}
128+
// fprintf(stdout, "%s(): New %p size=%zd\n", __FUNCTION__, (void *) ret_as_slo, ret_as_slo->size);
120129

121130
ssize_t i = 0;
122131
ssize_t ub = ((SequenceLongObject *) self)->size;
123132
while (i < ub) {
133+
// fprintf(stdout, "%s(): Setting from %p [%zd] to [%zd]\n", __FUNCTION__, (void *) self, i, i);
124134
ret_as_slo->array_long[i] = ((SequenceLongObject *) self)->array_long[i];
125135
i++;
126136
}
127-
ub += ((SequenceLongObject *) other)->size;
128-
while (i < ub) {
129-
ret_as_slo->array_long[i] = ((SequenceLongObject *) other)->array_long[i];
137+
ssize_t j = 0;
138+
ub = ((SequenceLongObject *) other)->size;
139+
while (j < ub) {
140+
// fprintf(stdout, "%s(): Setting %p [%zd] to [%zd]\n", __FUNCTION__, (void *) other, j, i);
141+
ret_as_slo->array_long[i] = ((SequenceLongObject *) other)->array_long[j];
130142
i++;
143+
j++;
131144
}
132145
return ret;
133146
}

tests/unit/test_c_seqobject.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,15 @@ def test_SequenceLongObject_concat():
5252
obj_a = cSeqObject.SequenceLongObject([7, 4, 1, ])
5353
# print(obj_a[4])
5454
# assert list(obj_a) == [7, 4, 1, ]
55-
assert [v for v in obj_a] == [7, 4, 1, ]
55+
# assert [v for v in obj_a] == [7, 4, 1, ]
5656
obj_b = cSeqObject.SequenceLongObject([70, 40, 100, ])
57+
assert id(obj_a) != id(obj_b)
5758
obj = obj_a + obj_b
59+
assert id(obj) != id(obj_a)
60+
assert id(obj) != id(obj_b)
5861
assert len(obj) == 6
5962
assert list(obj) == [7, 4, 1, ] + [70, 40, 100, ]
6063

61-
62-
63-
64-
6564
# @pytest.mark.skipif(not (sys.version_info.minor < 7), reason='Python < 3.7')
6665
# def test_str_dir_pre_37():
6766
# s = cObject.Str()

0 commit comments

Comments
 (0)