@@ -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
5453static void
5554record_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 = {
176174static Py_hash_t
177175record_hash (PyRecordObject * v )
178176{
177+ // TODO
179178 return -1 ;
180179}
181180
@@ -189,13 +188,46 @@ record_getattro(PyObject *obj, PyObject *name)
189188static PyObject *
190189record_rich_compare (PyObject * v , PyObject * w , int op )
191190{
191+ // TODO
192192 return NULL ;
193193}
194194
195195static PyObject *
196196record_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
201233PyTypeObject 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