14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Implementation helper: a struct that looks like a tuple. See timemodule 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and posixmodule for example uses. */ 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h" 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structmember.h" 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structseq.h" 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char visible_length_key[] = "n_sequence_fields"; 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char real_length_key[] = "n_fields"; 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char unnamed_fields_key[] = "n_unnamed_fields"; 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Fields with this name have only a field index, not a field name. 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm They are only allowed for indices < n_visible_fields. */ 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmchar *PyStructSequence_UnnamedField = "unnamed field"; 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define VISIBLE_SIZE(op) Py_SIZE(op) 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define VISIBLE_SIZE_TP(tp) PyInt_AsLong( \ 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_GetItemString((tp)->tp_dict, visible_length_key)) 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define REAL_SIZE_TP(tp) PyInt_AsLong( \ 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_GetItemString((tp)->tp_dict, real_length_key)) 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op)) 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define UNNAMED_FIELDS_TP(tp) PyInt_AsLong( \ 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_GetItemString((tp)->tp_dict, unnamed_fields_key)) 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op)) 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyStructSequence_New(PyTypeObject *type) 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence *obj; 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = PyObject_New(PyStructSequence, type); 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_SIZE(obj) = VISIBLE_SIZE_TP(type); 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) obj; 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_dealloc(PyStructSequence *obj) 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, size; 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = REAL_SIZE(obj); 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < size; ++i) { 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(obj->ob_item[i]); 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_Del(obj); 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_length(PyStructSequence *obj) 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return VISIBLE_SIZE(obj); 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_item(PyStructSequence *obj, Py_ssize_t i) 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0 || i >= VISIBLE_SIZE(obj)) { 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_IndexError, "tuple index out of range"); 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(obj->ob_item[i]); 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return obj->ob_item[i]; 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_slice(PyStructSequence *obj, Py_ssize_t low, Py_ssize_t high) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTupleObject *np; 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (low < 0) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm low = 0; 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (high > VISIBLE_SIZE(obj)) 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm high = VISIBLE_SIZE(obj); 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (high < low) 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm high = low; 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm np = (PyTupleObject *)PyTuple_New(high-low); 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (np == NULL) 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for(i = low; i < high; ++i) { 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = obj->ob_item[i]; 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(np, i-low, v); 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *) np; 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_subscript(PyStructSequence *self, PyObject *item) 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyIndex_Check(item)) { 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i == -1 && PyErr_Occurred()) 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i += VISIBLE_SIZE(self); 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0 || i >= VISIBLE_SIZE(self)) { 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_IndexError, 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "tuple index out of range"); 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self->ob_item[i]); 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self->ob_item[i]; 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PySlice_Check(item)) { 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t start, stop, step, slicelen, cur, i; 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PySlice_GetIndicesEx((PySliceObject *)item, 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm VISIBLE_SIZE(self), &start, &stop, 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &step, &slicelen) < 0) { 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (slicelen <= 0) 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyTuple_New(0); 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyTuple_New(slicelen); 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (cur = start, i = 0; i < slicelen; 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cur += step, i++) { 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = self->ob_item[cur]; 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(result, i, v); 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "structseq index must be integer"); 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *arg = NULL; 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dict = NULL; 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ob; 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence *res = NULL; 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len, min_len, max_len, i, n_unnamed_fields; 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"sequence", "dict", 0}; 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:structseq", 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kwlist, &arg, &dict)) 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arg = PySequence_Fast(arg, "constructor requires a sequence"); 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!arg) { 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dict && !PyDict_Check(dict)) { 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%.500s() takes a dict as second arg, if any", 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_name); 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(arg); 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = PySequence_Fast_GET_SIZE(arg); 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm min_len = VISIBLE_SIZE_TP(type); 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm max_len = REAL_SIZE_TP(type); 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_unnamed_fields = UNNAMED_FIELDS_TP(type); 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (min_len != max_len) { 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < min_len) { 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%.500s() takes an at least %zd-sequence (%zd-sequence given)", 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_name, min_len, len); 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(arg); 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len > max_len) { 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%.500s() takes an at most %zd-sequence (%zd-sequence given)", 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_name, max_len, len); 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(arg); 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len != min_len) { 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%.500s() takes a %zd-sequence (%zd-sequence given)", 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_name, min_len, len); 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(arg); 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = (PyStructSequence*) PyStructSequence_New(type); 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (res == NULL) { 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < len; ++i) { 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = PySequence_Fast_GET_ITEM(arg, i); 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res->ob_item[i] = v; 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; i < max_len; ++i) { 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dict && (ob = PyDict_GetItemString( 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict, type->tp_members[i-n_unnamed_fields].name))) { 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ob = Py_None; 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(ob); 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res->ob_item[i] = ob; 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(arg); 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) res; 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmake_tuple(PyStructSequence *obj) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return structseq_slice(obj, 0, VISIBLE_SIZE(obj)); 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_repr(PyStructSequence *obj) 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* buffer and type size were chosen well considered. */ 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define REPR_BUFFER_SIZE 512 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TYPE_MAXSIZE 100 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup; 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTypeObject *typ = Py_TYPE(obj); 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, removelast = 0; 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len; 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char buf[REPR_BUFFER_SIZE]; 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *endofbuf, *pbuf = buf; 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* pointer to end of writeable buffer; safes space for "...)\0" */ 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm endofbuf= &buf[REPR_BUFFER_SIZE-5]; 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((tup = make_tuple(obj)) == NULL) { 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* "typename(", limited to TYPE_MAXSIZE */ 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strlen(typ->tp_name); 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strncpy(pbuf, typ->tp_name, len); 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf += len; 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf++ = '('; 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i=0; i < VISIBLE_SIZE(obj); i++) { 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *val, *repr; 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *cname, *crepr; 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cname = typ->tp_members[i].name; 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm val = PyTuple_GetItem(tup, i); 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (cname == NULL || val == NULL) { 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr = PyObject_Repr(val); 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (repr == NULL) { 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm crepr = PyString_AsString(repr); 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (crepr == NULL) { 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(repr); 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* + 3: keep space for "=" and ", " */ 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = strlen(cname) + strlen(crepr) + 3; 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((pbuf+len) <= endofbuf) { 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(pbuf, cname); 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf += strlen(cname); 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf++ = '='; 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(pbuf, crepr); 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf += strlen(crepr); 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf++ = ','; 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf++ = ' '; 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm removelast = 1; 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(repr); 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(pbuf, "..."); 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf += 3; 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm removelast = 0; 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(repr); 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (removelast) { 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* overwrite last ", " */ 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf-=2; 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf++ = ')'; 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf = '\0'; 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromString(buf); 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_concat(PyStructSequence *obj, PyObject *b) 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup, *result; 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tup = make_tuple(obj); 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PySequence_Concat(tup, b); 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_repeat(PyStructSequence *obj, Py_ssize_t n) 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup, *result; 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tup = make_tuple(obj); 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PySequence_Repeat(tup, n); 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_contains(PyStructSequence *obj, PyObject *o) 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup; 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int result; 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tup = make_tuple(obj); 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!tup) 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PySequence_Contains(tup, o); 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic long 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_hash(PyObject *obj) 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup; 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long result; 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tup = make_tuple((PyStructSequence*) obj); 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!tup) 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyObject_Hash(tup); 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_richcompare(PyObject *obj, PyObject *o2, int op) 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup, *result; 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tup = make_tuple((PyStructSequence*) obj); 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyObject_RichCompare(tup, o2, op); 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstructseq_reduce(PyStructSequence* self) 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* tup; 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* dict; 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* result; 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t n_fields, n_visible_fields, n_unnamed_fields; 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_fields = REAL_SIZE(self); 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_visible_fields = VISIBLE_SIZE(self); 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_unnamed_fields = UNNAMED_FIELDS(self); 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tup = PyTuple_New(n_visible_fields); 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!tup) { 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict = PyDict_New(); 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!dict) { 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < n_visible_fields; i++) { 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self->ob_item[i]); 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(tup, i, self->ob_item[i]); 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; i < n_fields; i++) { 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *n = Py_TYPE(self)->tp_members[i-n_unnamed_fields].name; 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(dict, n, 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->ob_item[i]); 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_BuildValue("(O(OO))", Py_TYPE(self), tup, dict); 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(dict); 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PySequenceMethods structseq_as_sequence = { 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lenfunc)structseq_length, 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (binaryfunc)structseq_concat, /* sq_concat */ 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ssizeargfunc)structseq_repeat, /* sq_repeat */ 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ssizeargfunc)structseq_item, /* sq_item */ 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ssizessizeargfunc)structseq_slice, /* sq_slice */ 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* sq_ass_item */ 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* sq_ass_slice */ 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (objobjproc)structseq_contains, /* sq_contains */ 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMappingMethods structseq_as_mapping = { 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lenfunc)structseq_length, 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (binaryfunc)structseq_subscript, 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef structseq_methods[] = { 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"__reduce__", (PyCFunction)structseq_reduce, 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm METH_NOARGS, NULL}, 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL, NULL} 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject _struct_sequence_template = { 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(&PyType_Type, 0) 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NULL, /* tp_name */ 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_basicsize */ 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_itemsize */ 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)structseq_dealloc, /* tp_dealloc */ 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (reprfunc)structseq_repr, /* tp_repr */ 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &structseq_as_sequence, /* tp_as_sequence */ 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &structseq_as_mapping, /* tp_as_mapping */ 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm structseq_hash, /* tp_hash */ 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_call */ 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattro */ 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT, /* tp_flags */ 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NULL, /* tp_doc */ 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_traverse */ 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_clear */ 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm structseq_richcompare, /* tp_richcompare */ 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm structseq_methods, /* tp_methods */ 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NULL, /* tp_members */ 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getset */ 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_base */ 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dict */ 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_get */ 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_set */ 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dictoffset */ 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_init */ 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_alloc */ 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm structseq_new, /* tp_new */ 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dict; 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMemberDef* members; 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int n_members, n_unnamed_members, i, k; 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* if the type object was chained, unchain it first 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm before overwriting its storage */ 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type->_ob_next) { 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_ForgetReference((PyObject*)type); 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_unnamed_members = 0; 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; desc->fields[i].name != NULL; ++i) 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (desc->fields[i].name == PyStructSequence_UnnamedField) 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_unnamed_members++; 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n_members = i; 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memcpy(type, &_struct_sequence_template, sizeof(PyTypeObject)); 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_name = desc->name; 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_doc = desc->doc; 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_basicsize = sizeof(PyStructSequence)+ 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(PyObject*)*(n_members-1); 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_itemsize = 0; 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members = PyMem_NEW(PyMemberDef, n_members-n_unnamed_members+1); 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (members == NULL) 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = k = 0; i < n_members; ++i) { 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (desc->fields[i].name == PyStructSequence_UnnamedField) 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members[k].name = desc->fields[i].name; 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members[k].type = T_OBJECT; 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members[k].offset = offsetof(PyStructSequence, ob_item) 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm + i * sizeof(PyObject*); 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members[k].flags = READONLY; 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members[k].doc = desc->fields[i].doc; 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k++; 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm members[k].name = NULL; 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type->tp_members = members; 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(type) < 0) 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(type); 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict = type->tp_dict; 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SET_DICT_FROM_INT(key, value) \ 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { \ 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = PyInt_FromLong((long) value); \ 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v != NULL) { \ 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(dict, key, v); \ 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); \ 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (0) 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_DICT_FROM_INT(visible_length_key, desc->n_in_sequence); 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_DICT_FROM_INT(real_length_key, n_members); 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members); 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 540