Skip to content

Commit b1e0ab4

Browse files
committed
constructor
1 parent 4ac2d51 commit b1e0ab4

File tree

1 file changed

+37
-5
lines changed

1 file changed

+37
-5
lines changed

Objects/recordobject.c

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ record_alloc(Py_ssize_t size)
2929
sizeof(PyObject *))) / sizeof(PyObject *)) {
3030
return (PyRecordObject *)PyErr_NoMemory();
3131
}
32-
op = PyObject_GC_NewVar(PyRecordObject, &PyRecord_Type, size);
32+
op = PyObject_NewVar(PyRecordObject, &PyRecord_Type, size);
3333
if (op == NULL)
3434
return NULL;
3535
}
@@ -47,15 +47,13 @@ PyAPI_FUNC(PyObject *) PyRecord_New(Py_ssize_t size)
4747
for (Py_ssize_t i = 0; i < size; i++) {
4848
op->ob_item[i] = NULL;
4949
}
50-
record_gc_track(op);
5150
return (PyObject *) op;
5251
}
5352

5453
static void
5554
record_dealloc(PyRecordObject *op)
5655
{
5756
Py_ssize_t len = Py_SIZE(op);
58-
PyObject_GC_UnTrack(op);
5957
Py_TRASHCAN_BEGIN(op, record_dealloc)
6058
Py_XDECREF(op->names);
6159
if (len > 0) {
@@ -176,6 +174,7 @@ static PySequenceMethods record_as_sequence = {
176174
static Py_hash_t
177175
record_hash(PyRecordObject *v)
178176
{
177+
// TODO
179178
return -1;
180179
}
181180

@@ -189,13 +188,46 @@ record_getattro(PyObject *obj, PyObject *name)
189188
static PyObject *
190189
record_rich_compare(PyObject *v, PyObject *w, int op)
191190
{
191+
// TODO
192192
return NULL;
193193
}
194194

195195
static PyObject *
196196
record_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
197197
{
198-
return NULL;
198+
PyObject *return_value = NULL;
199+
PyObject *keys_list, *values_list;
200+
Py_ssize_t n, i;
201+
202+
if (PyTuple_GET_SIZE(args) != 0) {
203+
PyErr_SetString(PyExc_TypeError, "record() takes no positional arguments");
204+
return NULL;
205+
}
206+
207+
if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
208+
PyRecordObject *rec = (PyRecordObject*) PyRecord_New(0);
209+
if (rec == NULL) return NULL;
210+
rec->names = PyTuple_New(0);
211+
return (PyObject*)rec;
212+
}
213+
214+
n = PyDict_GET_SIZE(kwargs);
215+
PyRecordObject *rec = (PyRecordObject*) PyRecord_New(n);
216+
if (rec == NULL) return NULL;
217+
218+
keys_list = PyDict_Keys(kwargs);
219+
rec->names = PyList_AsTuple(keys_list);
220+
Py_DECREF(keys_list);
221+
222+
values_list = PyDict_Values(kwargs);
223+
for (i = 0; i < n; i++) {
224+
PyObject *val = PyList_GET_ITEM(values_list, i);
225+
Py_INCREF(val);
226+
rec->ob_item[i] = val;
227+
}
228+
Py_DECREF(values_list);
229+
230+
return (PyObject*) rec;
199231
}
200232

201233
PyTypeObject PyRecord_Type = {
@@ -237,6 +269,6 @@ PyTypeObject PyRecord_Type = {
237269
0, /* tp_init */
238270
0, /* tp_alloc */
239271
record_new, /* tp_new */
240-
PyObject_GC_Del, /* tp_free */
272+
PyObject_Free, /* tp_free */
241273
0,
242274
};

0 commit comments

Comments
 (0)