annotate Objects/structseq.c @ 85327:5b5ef012cd4e

Issue #16809: Fixed some tkinter incompabilities with Tcl/Tk 8.6.
author Serhiy Storchaka <storchaka@gmail.com>
date Thu, 22 Aug 2013 17:53:06 +0300
parents fc718c177ee6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Implementation helper: a struct that looks like a tuple. See timemodule
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 and posixmodule for example uses. */
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #include "Python.h"
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 #include "structmember.h"
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 static char visible_length_key[] = "n_sequence_fields";
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 static char real_length_key[] = "n_fields";
25808
fdca87c4234e Add n_unnamed_fields into the type.
Martin v. Löwis <martin@v.loewis.de>
parents: 25806
diff changeset
9 static char unnamed_fields_key[] = "n_unnamed_fields";
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
11 /* Fields with this name have only a field index, not a field name.
25806
0bbea4dcd9be Add PyStructSequence_UnnamedField. Add stat_float_times.
Martin v. Löwis <martin@v.loewis.de>
parents: 22978
diff changeset
12 They are only allowed for indices < n_visible_fields. */
0bbea4dcd9be Add PyStructSequence_UnnamedField. Add stat_float_times.
Martin v. Löwis <martin@v.loewis.de>
parents: 22978
diff changeset
13 char *PyStructSequence_UnnamedField = "unnamed field";
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
14 _Py_IDENTIFIER(n_sequence_fields);
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
15 _Py_IDENTIFIER(n_fields);
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
16 _Py_IDENTIFIER(n_unnamed_fields);
25806
0bbea4dcd9be Add PyStructSequence_UnnamedField. Add stat_float_times.
Martin v. Löwis <martin@v.loewis.de>
parents: 22978
diff changeset
17
44351
86a2679dca46 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
18 #define VISIBLE_SIZE(op) Py_SIZE(op)
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43100
diff changeset
19 #define VISIBLE_SIZE_TP(tp) PyLong_AsLong( \
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
20 _PyDict_GetItemId((tp)->tp_dict, &PyId_n_sequence_fields))
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43100
diff changeset
22 #define REAL_SIZE_TP(tp) PyLong_AsLong( \
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
23 _PyDict_GetItemId((tp)->tp_dict, &PyId_n_fields))
44351
86a2679dca46 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
24 #define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op))
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43100
diff changeset
26 #define UNNAMED_FIELDS_TP(tp) PyLong_AsLong( \
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
27 _PyDict_GetItemId((tp)->tp_dict, &PyId_n_unnamed_fields))
44351
86a2679dca46 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
28 #define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op))
25808
fdca87c4234e Add n_unnamed_fields into the type.
Martin v. Löwis <martin@v.loewis.de>
parents: 25806
diff changeset
29
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 PyObject *
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 PyStructSequence_New(PyTypeObject *type)
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
34 PyStructSequence *obj;
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
35 Py_ssize_t size = REAL_SIZE_TP(type), i;
44674
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
36
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
37 obj = PyObject_GC_NewVar(PyStructSequence, type, size);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
38 if (obj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
39 return NULL;
62877
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
40 /* Hack the size of the variable object, so invisible fields don't appear
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
41 to Python code. */
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
42 Py_SIZE(obj) = VISIBLE_SIZE_TP(type);
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
43 for (i = 0; i < size; i++)
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
44 obj->ob_item[i] = NULL;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
45
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
46 return (PyObject*)obj;
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42334
diff changeset
47 }
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42334
diff changeset
48
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
49 void
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
50 PyStructSequence_SetItem(PyObject* op, Py_ssize_t i, PyObject* v)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
51 {
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
52 PyStructSequence_SET_ITEM(op, i, v);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
53 }
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
54
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
55 PyObject*
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
56 PyStructSequence_GetItem(PyObject* op, Py_ssize_t i)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
57 {
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
58 return PyStructSequence_GET_ITEM(op, i);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
59 }
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
60
62877
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
61 static void
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
62 structseq_dealloc(PyStructSequence *obj)
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
63 {
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
64 Py_ssize_t i, size;
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
65
62877
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
66 size = REAL_SIZE(obj);
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
67 for (i = 0; i < size; ++i) {
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
68 Py_XDECREF(obj->ob_item[i]);
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
69 }
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
70 PyObject_GC_Del(obj);
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
71 }
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
72
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42334
diff changeset
73 static PyObject *
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 structseq_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
76 PyObject *arg = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
77 PyObject *dict = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
78 PyObject *ob;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
79 PyStructSequence *res = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
80 Py_ssize_t len, min_len, max_len, i, n_unnamed_fields;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
81 static char *kwlist[] = {"sequence", "dict", 0};
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
83 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:structseq",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
84 kwlist, &arg, &dict))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
85 return NULL;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
86
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
87 arg = PySequence_Fast(arg, "constructor requires a sequence");
22166
837951ecdce9 After some thinking, I decided to move all of this across onto
Michael W. Hudson <mwh@python.net>
parents: 22137
diff changeset
88
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
89 if (!arg) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
90 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
91 }
22166
837951ecdce9 After some thinking, I decided to move all of this across onto
Michael W. Hudson <mwh@python.net>
parents: 22137
diff changeset
92
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
93 if (dict && !PyDict_Check(dict)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
94 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
95 "%.500s() takes a dict as second arg, if any",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
96 type->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
97 Py_DECREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
98 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
99 }
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
101 len = PySequence_Fast_GET_SIZE(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
102 min_len = VISIBLE_SIZE_TP(type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
103 max_len = REAL_SIZE_TP(type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
104 n_unnamed_fields = UNNAMED_FIELDS_TP(type);
22166
837951ecdce9 After some thinking, I decided to move all of this across onto
Michael W. Hudson <mwh@python.net>
parents: 22137
diff changeset
105
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
106 if (min_len != max_len) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
107 if (len < min_len) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
108 PyErr_Format(PyExc_TypeError,
74940
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
109 "%.500s() takes an at least %zd-sequence (%zd-sequence given)",
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
110 type->tp_name, min_len, len);
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
111 Py_DECREF(arg);
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
112 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
113 }
22166
837951ecdce9 After some thinking, I decided to move all of this across onto
Michael W. Hudson <mwh@python.net>
parents: 22137
diff changeset
114
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
115 if (len > max_len) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
116 PyErr_Format(PyExc_TypeError,
74940
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
117 "%.500s() takes an at most %zd-sequence (%zd-sequence given)",
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
118 type->tp_name, max_len, len);
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
119 Py_DECREF(arg);
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
120 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
121 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
122 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
123 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
124 if (len != min_len) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
125 PyErr_Format(PyExc_TypeError,
74940
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
126 "%.500s() takes a %zd-sequence (%zd-sequence given)",
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
127 type->tp_name, min_len, len);
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
128 Py_DECREF(arg);
7f267a650a1d Fix indentation
Antoine Pitrou <solipsis@pitrou.net>
parents: 74939
diff changeset
129 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
130 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
131 }
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
133 res = (PyStructSequence*) PyStructSequence_New(type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
134 if (res == NULL) {
74939
6454e5de7c34 Issue #13020: Fix a reference leak when allocating a structsequence object fails.
Antoine Pitrou <solipsis@pitrou.net>
parents: 66664
diff changeset
135 Py_DECREF(arg);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
136 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
137 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
138 for (i = 0; i < len; ++i) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
139 PyObject *v = PySequence_Fast_GET_ITEM(arg, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
140 Py_INCREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
141 res->ob_item[i] = v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
142 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
143 for (; i < max_len; ++i) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
144 if (dict && (ob = PyDict_GetItemString(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
145 dict, type->tp_members[i-n_unnamed_fields].name))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
146 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
147 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
148 ob = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
149 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
150 Py_INCREF(ob);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
151 res->ob_item[i] = ob;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
152 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
153
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
154 Py_DECREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
155 return (PyObject*) res;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 }
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
157
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
158
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 static PyObject *
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 structseq_repr(PyStructSequence *obj)
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
162 /* buffer and type size were chosen well considered. */
44674
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
163 #define REPR_BUFFER_SIZE 512
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
164 #define TYPE_MAXSIZE 100
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
165
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
166 PyTypeObject *typ = Py_TYPE(obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
167 int i, removelast = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
168 Py_ssize_t len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
169 char buf[REPR_BUFFER_SIZE];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
170 char *endofbuf, *pbuf = buf;
44674
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
171
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
172 /* pointer to end of writeable buffer; safes space for "...)\0" */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
173 endofbuf= &buf[REPR_BUFFER_SIZE-5];
44674
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
174
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
175 /* "typename(", limited to TYPE_MAXSIZE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
176 len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE :
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
177 strlen(typ->tp_name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
178 strncpy(pbuf, typ->tp_name, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
179 pbuf += len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
180 *pbuf++ = '(';
44674
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
181
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
182 for (i=0; i < VISIBLE_SIZE(obj); i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
183 PyObject *val, *repr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
184 char *cname, *crepr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
185
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
186 cname = typ->tp_members[i].name;
62877
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
187 if (cname == NULL) {
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
188 PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %d name is NULL"
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
189 " for type %.500s", i, typ->tp_name);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
190 return NULL;
62877
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
191 }
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
192 val = PyStructSequence_GET_ITEM(obj, i);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
193 repr = PyObject_Repr(val);
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
194 if (repr == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
195 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
196 crepr = _PyUnicode_AsString(repr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
197 if (crepr == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
198 Py_DECREF(repr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
199 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
200 }
44674
1154158a199f Merged revisions 59933-59951 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
201
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
202 /* + 3: keep space for "=" and ", " */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
203 len = strlen(cname) + strlen(crepr) + 3;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
204 if ((pbuf+len) <= endofbuf) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
205 strcpy(pbuf, cname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
206 pbuf += strlen(cname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
207 *pbuf++ = '=';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
208 strcpy(pbuf, crepr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
209 pbuf += strlen(crepr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
210 *pbuf++ = ',';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
211 *pbuf++ = ' ';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
212 removelast = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
213 Py_DECREF(repr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
214 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
215 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
216 strcpy(pbuf, "...");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
217 pbuf += 3;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
218 removelast = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
219 Py_DECREF(repr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
220 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
221 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
222 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
223 if (removelast) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
224 /* overwrite last ", " */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
225 pbuf-=2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
226 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
227 *pbuf++ = ')';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
228 *pbuf = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
229
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
230 return PyUnicode_FromString(buf);
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 }
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 static PyObject *
22137
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
234 structseq_reduce(PyStructSequence* self)
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
235 {
84689
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
236 PyObject* tup = NULL;
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
237 PyObject* dict = NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
238 PyObject* result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
239 Py_ssize_t n_fields, n_visible_fields, n_unnamed_fields;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
240 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
241
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
242 n_fields = REAL_SIZE(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
243 n_visible_fields = VISIBLE_SIZE(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
244 n_unnamed_fields = UNNAMED_FIELDS(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
245 tup = PyTuple_New(n_visible_fields);
84689
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
246 if (!tup)
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
247 goto error;
22137
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
248
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
249 dict = PyDict_New();
84689
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
250 if (!dict)
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
251 goto error;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
252
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
253 for (i = 0; i < n_visible_fields; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
254 Py_INCREF(self->ob_item[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
255 PyTuple_SET_ITEM(tup, i, self->ob_item[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
256 }
22166
837951ecdce9 After some thinking, I decided to move all of this across onto
Michael W. Hudson <mwh@python.net>
parents: 22137
diff changeset
257
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
258 for (; i < n_fields; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
259 char *n = Py_TYPE(self)->tp_members[i-n_unnamed_fields].name;
84689
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
260 if (PyDict_SetItemString(dict, n, self->ob_item[i]) < 0)
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
261 goto error;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
262 }
22166
837951ecdce9 After some thinking, I decided to move all of this across onto
Michael W. Hudson <mwh@python.net>
parents: 22137
diff changeset
263
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
264 result = Py_BuildValue("(O(OO))", Py_TYPE(self), tup, dict);
22168
68831ac5495b backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 22166
diff changeset
265
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
266 Py_DECREF(tup);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
267 Py_DECREF(dict);
22168
68831ac5495b backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 22166
diff changeset
268
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
269 return result;
84689
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
270
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
271 error:
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
272 Py_XDECREF(tup);
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
273 Py_XDECREF(dict);
7b81a535ad14 Issue #18408: Fix structseq_reduce(), handle PyDict_SetItemString() failure
Victor Stinner <vstinner@wyplay.com>
parents: 84684
diff changeset
274 return NULL;
22137
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
275 }
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
276
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
277 static PyMethodDef structseq_methods[] = {
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
278 {"__reduce__", (PyCFunction)structseq_reduce, METH_NOARGS, NULL},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
279 {NULL, NULL}
22137
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
280 };
1a5110b4bd72 backport my checkin of
Michael W. Hudson <mwh@python.net>
parents: 21081
diff changeset
281
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 static PyTypeObject _struct_sequence_template = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
283 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
284 NULL, /* tp_name */
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
285 sizeof(PyStructSequence) - sizeof(PyObject *), /* tp_basicsize */
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
286 sizeof(PyObject *), /* tp_itemsize */
62877
e4bda4a520ca fix repr of complicated structseqs #9206
Benjamin Peterson <benjamin@python.org>
parents: 62853
diff changeset
287 (destructor)structseq_dealloc, /* tp_dealloc */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
288 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
289 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
290 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
291 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
292 (reprfunc)structseq_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
293 0, /* tp_as_number */
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
294 0, /* tp_as_sequence */
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
295 0, /* tp_as_mapping */
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
296 0, /* tp_hash */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
297 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
298 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
299 0, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
300 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
301 0, /* tp_as_buffer */
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
302 Py_TPFLAGS_DEFAULT, /* tp_flags */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
303 NULL, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
304 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
305 0, /* tp_clear */
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
306 0, /* tp_richcompare */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
307 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
308 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
309 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
310 structseq_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
311 NULL, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
312 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
313 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
314 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
315 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
316 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
317 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
318 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
319 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
320 structseq_new, /* tp_new */
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 };
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
322
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
323 int
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
324 PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
326 PyObject *dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
327 PyMemberDef* members;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
328 int n_members, n_unnamed_members, i, k;
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
329 PyObject *v;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
330
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
331 #ifdef Py_TRACE_REFS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
332 /* if the type object was chained, unchain it first
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
333 before overwriting its storage */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
334 if (type->ob_base.ob_base._ob_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
335 _Py_ForgetReference((PyObject*)type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
336 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
337 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
338
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
339 n_unnamed_members = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
340 for (i = 0; desc->fields[i].name != NULL; ++i)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
341 if (desc->fields[i].name == PyStructSequence_UnnamedField)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
342 n_unnamed_members++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
343 n_members = i;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
344
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
345 memcpy(type, &_struct_sequence_template, sizeof(PyTypeObject));
62853
384f73a104e9 make struct sequences subclass tuple; kill lots of code
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
346 type->tp_base = &PyTuple_Type;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
347 type->tp_name = desc->name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
348 type->tp_doc = desc->doc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
349
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
350 members = PyMem_NEW(PyMemberDef, n_members-n_unnamed_members+1);
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
351 if (members == NULL) {
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
352 PyErr_NoMemory();
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
353 return -1;
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
354 }
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
355
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
356 for (i = k = 0; i < n_members; ++i) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
357 if (desc->fields[i].name == PyStructSequence_UnnamedField)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
358 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
359 members[k].name = desc->fields[i].name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
360 members[k].type = T_OBJECT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
361 members[k].offset = offsetof(PyStructSequence, ob_item)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
362 + i * sizeof(PyObject*);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
363 members[k].flags = READONLY;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
364 members[k].doc = desc->fields[i].doc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
365 k++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
366 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
367 members[k].name = NULL;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
368
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
369 type->tp_members = members;
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
370
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
371 if (PyType_Ready(type) < 0)
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
372 return -1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
373 Py_INCREF(type);
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
374
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
375 dict = type->tp_dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
376 #define SET_DICT_FROM_INT(key, value) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
377 do { \
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
378 v = PyLong_FromLong((long) value); \
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
379 if (v == NULL) \
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
380 return -1; \
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
381 if (PyDict_SetItemString(dict, key, v) < 0) { \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
382 Py_DECREF(v); \
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
383 return -1; \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
384 } \
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
385 Py_DECREF(v); \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
386 } while (0)
48848
5c75a33ef5b2 Merged revisions 66006 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 48660
diff changeset
387
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
388 SET_DICT_FROM_INT(visible_length_key, desc->n_in_sequence);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
389 SET_DICT_FROM_INT(real_length_key, n_members);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51271
diff changeset
390 SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members);
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
391
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
392 return 0;
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
393 }
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
394
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
395 void
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
396 PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
397 {
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
398 (void)PyStructSequence_InitType2(type, desc);
20540
ad2662095d77 Missing file structseq.c for SF patch #462296
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 }
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
400
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
401 PyTypeObject*
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
402 PyStructSequence_NewType(PyStructSequence_Desc *desc)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
403 {
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
404 PyTypeObject *result;
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
405
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
406 result = (PyTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
407 if (result == NULL)
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
408 return NULL;
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
409 if (PyStructSequence_InitType2(result, desc) < 0) {
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
410 Py_DECREF(result);
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 84689
diff changeset
411 return NULL;
78648
f5e0561e9aa9 Check for NULL return value in PyStructSequence_NewType(). Found by Coverity.
Stefan Krah <skrah@bytereef.org>
parents: 74940
diff changeset
412 }
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
413 return result;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66555
diff changeset
414 }
84684
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
415
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
416 int _PyStructSequence_Init(void)
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
417 {
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
418 if (_PyUnicode_FromId(&PyId_n_sequence_fields) == NULL
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
419 || _PyUnicode_FromId(&PyId_n_fields) == NULL
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
420 || _PyUnicode_FromId(&PyId_n_unnamed_fields) == NULL)
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
421 return -1;
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
422
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
423 return 0;
af18829a7754 Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
Victor Stinner <victor.stinner@gmail.com>
parents: 78648
diff changeset
424 }