Mercurial > cpython-lru_cache-weakref
annotate Objects/codeobject.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | bea4447c22bf |
| children |
| rev | line source |
|---|---|
| 35742 | 1 #include "Python.h" |
| 2 #include "code.h" | |
| 3 #include "structmember.h" | |
| 4 | |
| 5 #define NAME_CHARS \ | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
6 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" |
| 35742 | 7 |
| 8 /* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */ | |
| 9 | |
| 10 static int | |
| 72475 | 11 all_name_chars(PyObject *o) |
| 35742 | 12 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
13 static char ok_name_char[256]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
14 static unsigned char *name_chars = (unsigned char *)NAME_CHARS; |
| 72475 | 15 PyUnicodeObject *u = (PyUnicodeObject *)o; |
| 16 const unsigned char *s; | |
| 17 | |
| 18 if (!PyUnicode_Check(o) || PyUnicode_READY(u) == -1 || | |
| 19 PyUnicode_MAX_CHAR_VALUE(u) >= 128) | |
| 20 return 0; | |
| 35742 | 21 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
22 if (ok_name_char[*name_chars] == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
23 unsigned char *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
24 for (p = name_chars; *p; p++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
25 ok_name_char[*p] = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
26 } |
| 72475 | 27 s = PyUnicode_1BYTE_DATA(u); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
28 while (*s) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
29 if (ok_name_char[*s++] == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
30 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
31 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
32 return 1; |
| 35742 | 33 } |
| 34 | |
| 35 static void | |
| 36 intern_strings(PyObject *tuple) | |
| 37 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
38 Py_ssize_t i; |
| 35742 | 39 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
40 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
41 PyObject *v = PyTuple_GET_ITEM(tuple, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
42 if (v == NULL || !PyUnicode_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
43 Py_FatalError("non-string found in code slot"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
44 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
45 PyUnicode_InternInPlace(&PyTuple_GET_ITEM(tuple, i)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
46 } |
| 35742 | 47 } |
| 48 | |
| 49 | |
| 50 PyCodeObject * | |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39658
diff
changeset
|
51 PyCode_New(int argcount, int kwonlyargcount, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
52 int nlocals, int stacksize, int flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
53 PyObject *code, PyObject *consts, PyObject *names, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
54 PyObject *varnames, PyObject *freevars, PyObject *cellvars, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
55 PyObject *filename, PyObject *name, int firstlineno, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
56 PyObject *lnotab) |
| 35742 | 57 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
58 PyCodeObject *co; |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
59 unsigned char *cell2arg = NULL; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
60 Py_ssize_t i, n_cellvars; |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
42802
diff
changeset
|
61 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
62 /* Check argument types */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
63 if (argcount < 0 || kwonlyargcount < 0 || nlocals < 0 || |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
64 code == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
65 consts == NULL || !PyTuple_Check(consts) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
66 names == NULL || !PyTuple_Check(names) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
67 varnames == NULL || !PyTuple_Check(varnames) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
68 freevars == NULL || !PyTuple_Check(freevars) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
69 cellvars == NULL || !PyTuple_Check(cellvars) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
70 name == NULL || !PyUnicode_Check(name) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
71 filename == NULL || !PyUnicode_Check(filename) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
72 lnotab == NULL || !PyBytes_Check(lnotab) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
73 !PyObject_CheckReadBuffer(code)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
74 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
75 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
76 } |
|
86196
bea4447c22bf
Issue #18874: PyCode_New() now ensures that the filename is a ready Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
78290
diff
changeset
|
77 |
|
bea4447c22bf
Issue #18874: PyCode_New() now ensures that the filename is a ready Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
78290
diff
changeset
|
78 /* Ensure that the filename is a ready Unicode string */ |
|
bea4447c22bf
Issue #18874: PyCode_New() now ensures that the filename is a ready Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
78290
diff
changeset
|
79 if (PyUnicode_READY(filename) < 0) |
|
bea4447c22bf
Issue #18874: PyCode_New() now ensures that the filename is a ready Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
78290
diff
changeset
|
80 return NULL; |
|
bea4447c22bf
Issue #18874: PyCode_New() now ensures that the filename is a ready Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
78290
diff
changeset
|
81 |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
82 n_cellvars = PyTuple_GET_SIZE(cellvars); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
83 intern_strings(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
84 intern_strings(varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
85 intern_strings(freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
86 intern_strings(cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
87 /* Intern selected string constants */ |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
88 for (i = PyTuple_GET_SIZE(consts); --i >= 0; ) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
89 PyObject *v = PyTuple_GetItem(consts, i); |
| 72475 | 90 if (!all_name_chars(v)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
91 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
92 PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
93 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
94 /* Create mapping between cells and arguments if needed. */ |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
95 if (n_cellvars) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
96 Py_ssize_t total_args = argcount + kwonlyargcount + |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
97 ((flags & CO_VARARGS) != 0) + ((flags & CO_VARKEYWORDS) != 0); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
98 Py_ssize_t alloc_size = sizeof(unsigned char) * n_cellvars; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
99 int used_cell2arg = 0; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
100 cell2arg = PyMem_MALLOC(alloc_size); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
101 if (cell2arg == NULL) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
102 return NULL; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
103 memset(cell2arg, CO_CELL_NOT_AN_ARG, alloc_size); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
104 /* Find cells which are also arguments. */ |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
105 for (i = 0; i < n_cellvars; i++) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
106 Py_ssize_t j; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
107 PyObject *cell = PyTuple_GET_ITEM(cellvars, i); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
108 for (j = 0; j < total_args; j++) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
109 PyObject *arg = PyTuple_GET_ITEM(varnames, j); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
110 if (!PyUnicode_Compare(cell, arg)) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
111 cell2arg[i] = j; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
112 used_cell2arg = 1; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
113 break; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
114 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
115 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
116 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
117 if (!used_cell2arg) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
118 PyMem_FREE(cell2arg); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
119 cell2arg = NULL; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
120 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
121 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
122 co = PyObject_NEW(PyCodeObject, &PyCode_Type); |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
123 if (co == NULL) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
124 if (cell2arg) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
125 PyMem_FREE(cell2arg); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
126 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
127 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
128 co->co_argcount = argcount; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
129 co->co_kwonlyargcount = kwonlyargcount; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
130 co->co_nlocals = nlocals; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
131 co->co_stacksize = stacksize; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
132 co->co_flags = flags; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
133 Py_INCREF(code); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
134 co->co_code = code; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
135 Py_INCREF(consts); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
136 co->co_consts = consts; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
137 Py_INCREF(names); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
138 co->co_names = names; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
139 Py_INCREF(varnames); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
140 co->co_varnames = varnames; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
141 Py_INCREF(freevars); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
142 co->co_freevars = freevars; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
143 Py_INCREF(cellvars); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
144 co->co_cellvars = cellvars; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
145 co->co_cell2arg = cell2arg; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
146 Py_INCREF(filename); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
147 co->co_filename = filename; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
148 Py_INCREF(name); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
149 co->co_name = name; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
150 co->co_firstlineno = firstlineno; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
151 Py_INCREF(lnotab); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
152 co->co_lnotab = lnotab; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
153 co->co_zombieframe = NULL; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
154 co->co_weakreflist = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
155 return co; |
| 35742 | 156 } |
| 157 | |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
158 PyCodeObject * |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
159 PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
160 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
161 static PyObject *emptystring = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
162 static PyObject *nulltuple = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
163 PyObject *filename_ob = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
164 PyObject *funcname_ob = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
165 PyCodeObject *result = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
166 if (emptystring == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
167 emptystring = PyBytes_FromString(""); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
168 if (emptystring == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
169 goto failed; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
170 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
171 if (nulltuple == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
172 nulltuple = PyTuple_New(0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
173 if (nulltuple == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
174 goto failed; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
175 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
176 funcname_ob = PyUnicode_FromString(funcname); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
177 if (funcname_ob == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
178 goto failed; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
179 filename_ob = PyUnicode_DecodeFSDefault(filename); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
180 if (filename_ob == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
181 goto failed; |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
182 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
183 result = PyCode_New(0, /* argcount */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
184 0, /* kwonlyargcount */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
185 0, /* nlocals */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
186 0, /* stacksize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
187 0, /* flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
188 emptystring, /* code */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
189 nulltuple, /* consts */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
190 nulltuple, /* names */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
191 nulltuple, /* varnames */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
192 nulltuple, /* freevars */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
193 nulltuple, /* cellvars */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
194 filename_ob, /* filename */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
195 funcname_ob, /* name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
196 firstlineno, /* firstlineno */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
197 emptystring /* lnotab */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
198 ); |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
199 |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
200 failed: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
201 Py_XDECREF(funcname_ob); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
202 Py_XDECREF(filename_ob); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
203 return result; |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
204 } |
| 35742 | 205 |
| 206 #define OFF(x) offsetof(PyCodeObject, x) | |
| 207 | |
| 208 static PyMemberDef code_memberlist[] = { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
209 {"co_argcount", T_INT, OFF(co_argcount), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
210 {"co_kwonlyargcount", T_INT, OFF(co_kwonlyargcount), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
211 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
212 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
213 {"co_flags", T_INT, OFF(co_flags), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
214 {"co_code", T_OBJECT, OFF(co_code), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
215 {"co_consts", T_OBJECT, OFF(co_consts), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
216 {"co_names", T_OBJECT, OFF(co_names), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
217 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
218 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
219 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
220 {"co_filename", T_OBJECT, OFF(co_filename), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
221 {"co_name", T_OBJECT, OFF(co_name), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
222 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
223 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
224 {NULL} /* Sentinel */ |
| 35742 | 225 }; |
| 226 | |
| 227 /* Helper for code_new: return a shallow copy of a tuple that is | |
| 228 guaranteed to contain exact strings, by converting string subclasses | |
| 229 to exact strings and complaining if a non-string is found. */ | |
| 230 static PyObject* | |
| 231 validate_and_copy_tuple(PyObject *tup) | |
| 232 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
233 PyObject *newtuple; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
234 PyObject *item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
235 Py_ssize_t i, len; |
| 35742 | 236 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
237 len = PyTuple_GET_SIZE(tup); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
238 newtuple = PyTuple_New(len); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
239 if (newtuple == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
240 return NULL; |
| 35742 | 241 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
242 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
243 item = PyTuple_GET_ITEM(tup, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
244 if (PyUnicode_CheckExact(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
245 Py_INCREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
246 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
247 else if (!PyUnicode_Check(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
248 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
249 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
250 "name tuples must contain only " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
251 "strings, not '%.500s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
252 item->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
253 Py_DECREF(newtuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
254 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
255 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
256 else { |
|
73942
9c76bb654809
Make PyUnicode_Copy() private => _PyUnicode_Copy()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72862
diff
changeset
|
257 item = _PyUnicode_Copy(item); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
258 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
259 Py_DECREF(newtuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
260 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
261 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
262 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
263 PyTuple_SET_ITEM(newtuple, i, item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
264 } |
| 35742 | 265 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
266 return newtuple; |
| 35742 | 267 } |
| 268 | |
| 269 PyDoc_STRVAR(code_doc, | |
|
55580
7b495c8f2a24
Merged revisions 73941-73943,74076,74094,74186,74211-74214,74247,74254,74262,74311,74334,74368 via svnmerge from
Georg Brandl <georg@python.org>
parents:
51271
diff
changeset
|
270 "code(argcount, kwonlyargcount, nlocals, stacksize, flags, codestring,\n\ |
|
44965
b70485011214
#1939: update code object docstring.
Georg Brandl <georg@python.org>
parents:
43777
diff
changeset
|
271 constants, names, varnames, filename, name, firstlineno,\n\ |
|
b70485011214
#1939: update code object docstring.
Georg Brandl <georg@python.org>
parents:
43777
diff
changeset
|
272 lnotab[, freevars[, cellvars]])\n\ |
| 35742 | 273 \n\ |
| 274 Create a code object. Not for the faint of heart."); | |
| 275 | |
| 276 static PyObject * | |
| 277 code_new(PyTypeObject *type, PyObject *args, PyObject *kw) | |
| 278 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
279 int argcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
280 int kwonlyargcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
281 int nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
282 int stacksize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
283 int flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
284 PyObject *co = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
285 PyObject *code; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
286 PyObject *consts; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
287 PyObject *names, *ournames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
288 PyObject *varnames, *ourvarnames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
289 PyObject *freevars = NULL, *ourfreevars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
290 PyObject *cellvars = NULL, *ourcellvars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
291 PyObject *filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
292 PyObject *name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
293 int firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
294 PyObject *lnotab; |
| 35742 | 295 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
296 if (!PyArg_ParseTuple(args, "iiiiiSO!O!O!UUiS|O!O!:code", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
297 &argcount, &kwonlyargcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
298 &nlocals, &stacksize, &flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
299 &code, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
300 &PyTuple_Type, &consts, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
301 &PyTuple_Type, &names, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
302 &PyTuple_Type, &varnames, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
303 &filename, &name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
304 &firstlineno, &lnotab, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
305 &PyTuple_Type, &freevars, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
306 &PyTuple_Type, &cellvars)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
307 return NULL; |
| 35742 | 308 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
309 if (argcount < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
310 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
311 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
312 "code: argcount must not be negative"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
313 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
314 } |
| 35742 | 315 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
316 if (kwonlyargcount < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
317 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
318 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
319 "code: kwonlyargcount must not be negative"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
320 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
321 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
322 if (nlocals < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
323 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
324 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
325 "code: nlocals must not be negative"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
326 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
327 } |
| 35742 | 328 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
329 ournames = validate_and_copy_tuple(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
330 if (ournames == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
331 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
332 ourvarnames = validate_and_copy_tuple(varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
333 if (ourvarnames == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
334 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
335 if (freevars) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
336 ourfreevars = validate_and_copy_tuple(freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
337 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
338 ourfreevars = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
339 if (ourfreevars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
340 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
341 if (cellvars) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
342 ourcellvars = validate_and_copy_tuple(cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
343 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
344 ourcellvars = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
345 if (ourcellvars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
346 goto cleanup; |
| 35742 | 347 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
348 co = (PyObject *)PyCode_New(argcount, kwonlyargcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
349 nlocals, stacksize, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
350 code, consts, ournames, ourvarnames, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
351 ourfreevars, ourcellvars, filename, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
352 name, firstlineno, lnotab); |
| 35742 | 353 cleanup: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
354 Py_XDECREF(ournames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
355 Py_XDECREF(ourvarnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
356 Py_XDECREF(ourfreevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
357 Py_XDECREF(ourcellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
358 return co; |
| 35742 | 359 } |
| 360 | |
| 361 static void | |
| 362 code_dealloc(PyCodeObject *co) | |
| 363 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
364 Py_XDECREF(co->co_code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
365 Py_XDECREF(co->co_consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
366 Py_XDECREF(co->co_names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
367 Py_XDECREF(co->co_varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
368 Py_XDECREF(co->co_freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
369 Py_XDECREF(co->co_cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
370 Py_XDECREF(co->co_filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
371 Py_XDECREF(co->co_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
372 Py_XDECREF(co->co_lnotab); |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
373 if (co->co_cell2arg != NULL) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
374 PyMem_FREE(co->co_cell2arg); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
375 if (co->co_zombieframe != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
376 PyObject_GC_Del(co->co_zombieframe); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
377 if (co->co_weakreflist != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
378 PyObject_ClearWeakRefs((PyObject*)co); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
379 PyObject_DEL(co); |
| 35742 | 380 } |
| 381 | |
| 382 static PyObject * | |
|
78290
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
383 code_sizeof(PyCodeObject *co, void *unused) |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
384 { |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
385 Py_ssize_t res; |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
386 |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
387 res = sizeof(PyCodeObject); |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
388 if (co->co_cell2arg != NULL && co->co_cellvars != NULL) |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
389 res += PyTuple_GET_SIZE(co->co_cellvars) * sizeof(unsigned char); |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
390 return PyLong_FromSsize_t(res); |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
391 } |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
392 |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
393 static PyObject * |
| 35742 | 394 code_repr(PyCodeObject *co) |
| 395 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
396 int lineno; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
397 if (co->co_firstlineno != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
398 lineno = co->co_firstlineno; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
399 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
400 lineno = -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
401 if (co->co_filename && PyUnicode_Check(co->co_filename)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
402 return PyUnicode_FromFormat( |
|
67367
a0d4eda8da0a
Remove arbitrary string length limits
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67347
diff
changeset
|
403 "<code object %U at %p, file \"%U\", line %d>", |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
404 co->co_name, co, co->co_filename, lineno); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
405 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
406 return PyUnicode_FromFormat( |
|
67367
a0d4eda8da0a
Remove arbitrary string length limits
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67347
diff
changeset
|
407 "<code object %U at %p, file ???, line %d>", |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
408 co->co_name, co, lineno); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
409 } |
| 35742 | 410 } |
| 411 | |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39069
diff
changeset
|
412 static PyObject * |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39069
diff
changeset
|
413 code_richcompare(PyObject *self, PyObject *other, int op) |
| 35742 | 414 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
415 PyCodeObject *co, *cp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
416 int eq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
417 PyObject *res; |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
418 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
419 if ((op != Py_EQ && op != Py_NE) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
420 !PyCode_Check(self) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
421 !PyCode_Check(other)) { |
|
71810
d0b0fcbb40db
Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents:
70987
diff
changeset
|
422 Py_RETURN_NOTIMPLEMENTED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
423 } |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
424 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
425 co = (PyCodeObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
426 cp = (PyCodeObject *)other; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39069
diff
changeset
|
427 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
428 eq = PyObject_RichCompareBool(co->co_name, cp->co_name, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
429 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
430 eq = co->co_argcount == cp->co_argcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
431 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
432 eq = co->co_kwonlyargcount == cp->co_kwonlyargcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
433 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
434 eq = co->co_nlocals == cp->co_nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
435 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
436 eq = co->co_flags == cp->co_flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
437 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
438 eq = co->co_firstlineno == cp->co_firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
439 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
440 eq = PyObject_RichCompareBool(co->co_code, cp->co_code, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
441 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
442 eq = PyObject_RichCompareBool(co->co_consts, cp->co_consts, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
443 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
444 eq = PyObject_RichCompareBool(co->co_names, cp->co_names, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
445 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
446 eq = PyObject_RichCompareBool(co->co_varnames, cp->co_varnames, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
447 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
448 eq = PyObject_RichCompareBool(co->co_freevars, cp->co_freevars, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
449 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
450 eq = PyObject_RichCompareBool(co->co_cellvars, cp->co_cellvars, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
451 if (eq <= 0) goto unequal; |
| 35742 | 452 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
453 if (op == Py_EQ) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
454 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
455 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
456 res = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
457 goto done; |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
458 |
|
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
459 unequal: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
460 if (eq < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
461 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
462 if (op == Py_NE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
463 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
464 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
465 res = Py_False; |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
466 |
|
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
467 done: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
468 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
469 return res; |
| 35742 | 470 } |
| 471 | |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
65366
diff
changeset
|
472 static Py_hash_t |
| 35742 | 473 code_hash(PyCodeObject *co) |
| 474 { | |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
65366
diff
changeset
|
475 Py_hash_t h, h0, h1, h2, h3, h4, h5, h6; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
476 h0 = PyObject_Hash(co->co_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
477 if (h0 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
478 h1 = PyObject_Hash(co->co_code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
479 if (h1 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
480 h2 = PyObject_Hash(co->co_consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
481 if (h2 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
482 h3 = PyObject_Hash(co->co_names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
483 if (h3 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
484 h4 = PyObject_Hash(co->co_varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
485 if (h4 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
486 h5 = PyObject_Hash(co->co_freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
487 if (h5 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
488 h6 = PyObject_Hash(co->co_cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
489 if (h6 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
490 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
491 co->co_argcount ^ co->co_kwonlyargcount ^ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
492 co->co_nlocals ^ co->co_flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
493 if (h == -1) h = -2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
494 return h; |
| 35742 | 495 } |
| 496 | |
| 497 /* XXX code objects need to participate in GC? */ | |
| 498 | |
|
78290
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
499 static struct PyMethodDef code_methods[] = { |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
500 {"__sizeof__", (PyCFunction)code_sizeof, METH_NOARGS}, |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
501 {NULL, NULL} /* sentinel */ |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
502 }; |
|
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
503 |
| 35742 | 504 PyTypeObject PyCode_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
505 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
506 "code", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
507 sizeof(PyCodeObject), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
508 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
509 (destructor)code_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
510 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
511 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
512 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
513 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
514 (reprfunc)code_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
515 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
516 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
517 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
518 (hashfunc)code_hash, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
519 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
520 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
521 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
522 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
523 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
524 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
525 code_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
526 0, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
527 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
528 code_richcompare, /* tp_richcompare */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
529 offsetof(PyCodeObject, co_weakreflist), /* tp_weaklistoffset */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
530 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
531 0, /* tp_iternext */ |
|
78290
5093cfdff2a9
Issue #15456: Fix code __sizeof__ after #12399 change.
Martin v. Löwis <martin@v.loewis.de>
parents:
73942
diff
changeset
|
532 code_methods, /* tp_methods */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
533 code_memberlist, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
534 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
535 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
536 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
537 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
538 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
539 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
540 0, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
541 0, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
542 code_new, /* tp_new */ |
| 35742 | 543 }; |
| 544 | |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
545 /* Use co_lnotab to compute the line number from a bytecode index, addrq. See |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
546 lnotab_notes.txt for the details of the lnotab representation. |
| 35742 | 547 */ |
| 548 | |
| 549 int | |
| 550 PyCode_Addr2Line(PyCodeObject *co, int addrq) | |
| 551 { | |
|
67347
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65494
diff
changeset
|
552 Py_ssize_t size = PyBytes_Size(co->co_lnotab) / 2; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
553 unsigned char *p = (unsigned char*)PyBytes_AsString(co->co_lnotab); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
554 int line = co->co_firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
555 int addr = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
556 while (--size >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
557 addr += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
558 if (addr > addrq) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
559 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
560 line += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
561 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
562 return line; |
| 35742 | 563 } |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
564 |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
565 /* Update *bounds to describe the first and one-past-the-last instructions in |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
566 the same line as lasti. Return the number of that line. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
567 int |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
568 _PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds) |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
569 { |
|
67347
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65494
diff
changeset
|
570 Py_ssize_t size; |
|
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65494
diff
changeset
|
571 int addr, line; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
572 unsigned char* p; |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
573 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
574 p = (unsigned char*)PyBytes_AS_STRING(co->co_lnotab); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
575 size = PyBytes_GET_SIZE(co->co_lnotab) / 2; |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
576 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
577 addr = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
578 line = co->co_firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
579 assert(line > 0); |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
580 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
581 /* possible optimization: if f->f_lasti == instr_ub |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
582 (likely to be a common case) then we already know |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
583 instr_lb -- if we stored the matching value of p |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
584 somwhere we could skip the first while loop. */ |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
585 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
586 /* See lnotab_notes.txt for the description of |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
587 co_lnotab. A point to remember: increments to p |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
588 come in (addr, line) pairs. */ |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
589 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
590 bounds->ap_lower = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
591 while (size > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
592 if (addr + *p > lasti) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
593 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
594 addr += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
595 if (*p) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
596 bounds->ap_lower = addr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
597 line += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
598 --size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
599 } |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
600 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
601 if (size > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
602 while (--size >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
603 addr += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
604 if (*p++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
605 break; |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
606 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
607 bounds->ap_upper = addr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
608 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
609 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
610 bounds->ap_upper = INT_MAX; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
611 } |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
612 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
613 return line; |
|
37838
cc48985c3266
Refactor: Move code that uses co_lnotab from ceval to codeobject
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36501
diff
changeset
|
614 } |
