Mercurial > cpython-lru_cache-weakref
annotate Objects/codeobject.c @ 73323:dad02a080bbc
Improve byte-compilation in packaging to be independent of -O or -B.
The code I fixed to comply with PEP 3147 still had one bug: When run
under python -O, some paths for pyc files would be pyo, because I called
imp.cache_from_source without explicit debug_override argument in some
places, and under -O that would return .pyo (this is well explained in
the imp docs). Now all code (util.byte_compile, build_py, install_lib)
can create .pyo files according to options given by users,
without interference from the calling Python’s own optimize mode.
On a related topic, I also removed the code that prevented byte
compilation under python -B. The rationale is that packaging gives
control over the creation of pyc files to the user with its own explicit
option, and the behavior should not be changed if the calling Python
happens to run with -B for whatever reason. I will argue that this is a
bug fix and ask to be allowed to backport this change to distutils.
Finally, I moved one nugget of information about the --compile and
--optimize options from the source into the doc. It clears up a
misunderstanding that I (and maybe other people) had.
| author | Éric Araujo <merwok@netwok.org> |
|---|---|
| date | Thu, 03 Nov 2011 05:08:28 +0100 |
| parents | 5aaf83414ae7 |
| children | 9c76bb654809 |
| 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 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
77 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
|
78 intern_strings(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
79 intern_strings(varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
80 intern_strings(freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
81 intern_strings(cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
82 /* 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
|
83 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
|
84 PyObject *v = PyTuple_GetItem(consts, i); |
| 72475 | 85 if (!all_name_chars(v)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
86 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
87 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
|
88 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
89 /* 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
|
90 if (n_cellvars) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
91 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
|
92 ((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
|
93 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
|
94 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
|
95 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
|
96 if (cell2arg == NULL) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
97 return NULL; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
98 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
|
99 /* 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 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
|
105 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
|
106 cell2arg[i] = j; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
107 used_cell2arg = 1; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
108 break; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
109 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
110 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
111 } |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
112 if (!used_cell2arg) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
113 PyMem_FREE(cell2arg); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
114 cell2arg = NULL; |
|
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 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
117 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
|
118 if (co == NULL) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
119 if (cell2arg) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
120 PyMem_FREE(cell2arg); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
121 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
122 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
123 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
|
124 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
|
125 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
|
126 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
|
127 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
|
128 Py_INCREF(code); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
129 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
|
130 Py_INCREF(consts); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
131 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
|
132 Py_INCREF(names); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
133 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
|
134 Py_INCREF(varnames); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
135 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
|
136 Py_INCREF(freevars); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
137 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
|
138 Py_INCREF(cellvars); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
139 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
|
140 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
|
141 Py_INCREF(filename); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
142 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
|
143 Py_INCREF(name); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
144 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
|
145 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
|
146 Py_INCREF(lnotab); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
147 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
|
148 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
|
149 co->co_weakreflist = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
150 return co; |
| 35742 | 151 } |
| 152 | |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
153 PyCodeObject * |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
154 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
|
155 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
156 static PyObject *emptystring = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
157 static PyObject *nulltuple = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
158 PyObject *filename_ob = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
159 PyObject *funcname_ob = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
160 PyCodeObject *result = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
161 if (emptystring == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
162 emptystring = PyBytes_FromString(""); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
163 if (emptystring == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
164 goto failed; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
165 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
166 if (nulltuple == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
167 nulltuple = PyTuple_New(0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
168 if (nulltuple == 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 funcname_ob = PyUnicode_FromString(funcname); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
172 if (funcname_ob == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
173 goto failed; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
174 filename_ob = PyUnicode_DecodeFSDefault(filename); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
175 if (filename_ob == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
176 goto failed; |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
177 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
178 result = PyCode_New(0, /* argcount */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
179 0, /* kwonlyargcount */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
180 0, /* nlocals */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
181 0, /* stacksize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
182 0, /* flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
183 emptystring, /* code */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
184 nulltuple, /* consts */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
185 nulltuple, /* names */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
186 nulltuple, /* varnames */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
187 nulltuple, /* freevars */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
188 nulltuple, /* cellvars */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
189 filename_ob, /* filename */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
190 funcname_ob, /* name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
191 firstlineno, /* firstlineno */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
192 emptystring /* lnotab */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
193 ); |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
194 |
|
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
195 failed: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
196 Py_XDECREF(funcname_ob); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
197 Py_XDECREF(filename_ob); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
198 return result; |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
199 } |
| 35742 | 200 |
| 201 #define OFF(x) offsetof(PyCodeObject, x) | |
| 202 | |
| 203 static PyMemberDef code_memberlist[] = { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
204 {"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
|
205 {"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
|
206 {"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
|
207 {"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
|
208 {"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
|
209 {"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
|
210 {"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
|
211 {"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
|
212 {"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
|
213 {"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
|
214 {"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
|
215 {"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
|
216 {"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
|
217 {"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
|
218 {"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
|
219 {NULL} /* Sentinel */ |
| 35742 | 220 }; |
| 221 | |
| 222 /* Helper for code_new: return a shallow copy of a tuple that is | |
| 223 guaranteed to contain exact strings, by converting string subclasses | |
| 224 to exact strings and complaining if a non-string is found. */ | |
| 225 static PyObject* | |
| 226 validate_and_copy_tuple(PyObject *tup) | |
| 227 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
228 PyObject *newtuple; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
229 PyObject *item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
230 Py_ssize_t i, len; |
| 35742 | 231 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
232 len = PyTuple_GET_SIZE(tup); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
233 newtuple = PyTuple_New(len); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
234 if (newtuple == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
235 return NULL; |
| 35742 | 236 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
237 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
238 item = PyTuple_GET_ITEM(tup, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
239 if (PyUnicode_CheckExact(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
240 Py_INCREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
241 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
242 else if (!PyUnicode_Check(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
243 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
244 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
245 "name tuples must contain only " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
246 "strings, not '%.500s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
247 item->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
248 Py_DECREF(newtuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
249 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
250 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
251 else { |
|
72862
5aaf83414ae7
Reuse PyUnicode_Copy() in validate_and_copy_tuple()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
252 item = PyUnicode_Copy(item); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
253 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
254 Py_DECREF(newtuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
255 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
256 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
257 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
258 PyTuple_SET_ITEM(newtuple, i, item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
259 } |
| 35742 | 260 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
261 return newtuple; |
| 35742 | 262 } |
| 263 | |
| 264 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
|
265 "code(argcount, kwonlyargcount, nlocals, stacksize, flags, codestring,\n\ |
|
44965
b70485011214
#1939: update code object docstring.
Georg Brandl <georg@python.org>
parents:
43777
diff
changeset
|
266 constants, names, varnames, filename, name, firstlineno,\n\ |
|
b70485011214
#1939: update code object docstring.
Georg Brandl <georg@python.org>
parents:
43777
diff
changeset
|
267 lnotab[, freevars[, cellvars]])\n\ |
| 35742 | 268 \n\ |
| 269 Create a code object. Not for the faint of heart."); | |
| 270 | |
| 271 static PyObject * | |
| 272 code_new(PyTypeObject *type, PyObject *args, PyObject *kw) | |
| 273 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
274 int argcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
275 int kwonlyargcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
276 int nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
277 int stacksize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
278 int flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
279 PyObject *co = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
280 PyObject *code; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
281 PyObject *consts; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
282 PyObject *names, *ournames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
283 PyObject *varnames, *ourvarnames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
284 PyObject *freevars = NULL, *ourfreevars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
285 PyObject *cellvars = NULL, *ourcellvars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
286 PyObject *filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
287 PyObject *name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
288 int firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
289 PyObject *lnotab; |
| 35742 | 290 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
291 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
|
292 &argcount, &kwonlyargcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
293 &nlocals, &stacksize, &flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
294 &code, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
295 &PyTuple_Type, &consts, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
296 &PyTuple_Type, &names, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
297 &PyTuple_Type, &varnames, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
298 &filename, &name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
299 &firstlineno, &lnotab, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
300 &PyTuple_Type, &freevars, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
301 &PyTuple_Type, &cellvars)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
302 return NULL; |
| 35742 | 303 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
304 if (argcount < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
305 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
306 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
307 "code: argcount must not be negative"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
308 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
309 } |
| 35742 | 310 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
311 if (kwonlyargcount < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
312 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
313 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
314 "code: kwonlyargcount must not be negative"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
315 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
316 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
317 if (nlocals < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
318 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
319 PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
320 "code: nlocals must not be negative"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
321 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
322 } |
| 35742 | 323 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
324 ournames = validate_and_copy_tuple(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
325 if (ournames == NULL) |
|
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 ourvarnames = validate_and_copy_tuple(varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
328 if (ourvarnames == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
329 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
330 if (freevars) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
331 ourfreevars = validate_and_copy_tuple(freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
332 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
333 ourfreevars = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
334 if (ourfreevars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
335 goto cleanup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
336 if (cellvars) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
337 ourcellvars = validate_and_copy_tuple(cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
338 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
339 ourcellvars = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
340 if (ourcellvars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
341 goto cleanup; |
| 35742 | 342 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
343 co = (PyObject *)PyCode_New(argcount, kwonlyargcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
344 nlocals, stacksize, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
345 code, consts, ournames, ourvarnames, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
346 ourfreevars, ourcellvars, filename, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
347 name, firstlineno, lnotab); |
| 35742 | 348 cleanup: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
349 Py_XDECREF(ournames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
350 Py_XDECREF(ourvarnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
351 Py_XDECREF(ourfreevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
352 Py_XDECREF(ourcellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
353 return co; |
| 35742 | 354 } |
| 355 | |
| 356 static void | |
| 357 code_dealloc(PyCodeObject *co) | |
| 358 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
359 Py_XDECREF(co->co_code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
360 Py_XDECREF(co->co_consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
361 Py_XDECREF(co->co_names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
362 Py_XDECREF(co->co_varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
363 Py_XDECREF(co->co_freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
364 Py_XDECREF(co->co_cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
365 Py_XDECREF(co->co_filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
366 Py_XDECREF(co->co_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
367 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
|
368 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
|
369 PyMem_FREE(co->co_cell2arg); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
370 if (co->co_zombieframe != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
371 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
|
372 if (co->co_weakreflist != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
373 PyObject_ClearWeakRefs((PyObject*)co); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
374 PyObject_DEL(co); |
| 35742 | 375 } |
| 376 | |
| 377 static PyObject * | |
| 378 code_repr(PyCodeObject *co) | |
| 379 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
380 int lineno; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
381 if (co->co_firstlineno != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
382 lineno = co->co_firstlineno; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
383 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
384 lineno = -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
385 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
|
386 return PyUnicode_FromFormat( |
|
67367
a0d4eda8da0a
Remove arbitrary string length limits
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67347
diff
changeset
|
387 "<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
|
388 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
|
389 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
390 return PyUnicode_FromFormat( |
|
67367
a0d4eda8da0a
Remove arbitrary string length limits
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67347
diff
changeset
|
391 "<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
|
392 co->co_name, co, lineno); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
393 } |
| 35742 | 394 } |
| 395 | |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
396 static PyObject * |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
397 code_richcompare(PyObject *self, PyObject *other, int op) |
| 35742 | 398 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
399 PyCodeObject *co, *cp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
400 int eq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
401 PyObject *res; |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
402 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
403 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
|
404 !PyCode_Check(self) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
405 !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
|
406 Py_RETURN_NOTIMPLEMENTED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
407 } |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
408 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
409 co = (PyCodeObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
410 cp = (PyCodeObject *)other; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
411 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
412 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
|
413 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
414 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
|
415 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
416 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
|
417 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
418 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
|
419 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
420 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
|
421 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
422 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
|
423 if (!eq) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
424 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
|
425 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
426 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
|
427 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
428 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
|
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 = 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
|
431 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
432 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
|
433 if (eq <= 0) goto unequal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
434 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
|
435 if (eq <= 0) goto unequal; |
| 35742 | 436 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
437 if (op == Py_EQ) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
438 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
439 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
440 res = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
441 goto done; |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
442 |
|
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
443 unequal: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
444 if (eq < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
445 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
446 if (op == Py_NE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
447 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
448 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
449 res = Py_False; |
|
39650
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
450 |
|
69f61f90c4fc
Implement == and != comparisons for code objects by value.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
451 done: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
452 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
453 return res; |
| 35742 | 454 } |
| 455 | |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
65366
diff
changeset
|
456 static Py_hash_t |
| 35742 | 457 code_hash(PyCodeObject *co) |
| 458 { | |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
65366
diff
changeset
|
459 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
|
460 h0 = PyObject_Hash(co->co_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
461 if (h0 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
462 h1 = PyObject_Hash(co->co_code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
463 if (h1 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
464 h2 = PyObject_Hash(co->co_consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
465 if (h2 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
466 h3 = PyObject_Hash(co->co_names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
467 if (h3 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
468 h4 = PyObject_Hash(co->co_varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
469 if (h4 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
470 h5 = PyObject_Hash(co->co_freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
471 if (h5 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
472 h6 = PyObject_Hash(co->co_cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
473 if (h6 == -1) return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
474 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
|
475 co->co_argcount ^ co->co_kwonlyargcount ^ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
476 co->co_nlocals ^ co->co_flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
477 if (h == -1) h = -2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
478 return h; |
| 35742 | 479 } |
| 480 | |
| 481 /* XXX code objects need to participate in GC? */ | |
| 482 | |
| 483 PyTypeObject PyCode_Type = { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
484 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
485 "code", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
486 sizeof(PyCodeObject), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
487 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
488 (destructor)code_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
489 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
490 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
491 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
492 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
493 (reprfunc)code_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
494 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
495 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
496 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
497 (hashfunc)code_hash, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
498 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
499 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
500 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
501 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
502 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
503 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
504 code_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
505 0, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
506 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
507 code_richcompare, /* tp_richcompare */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
508 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
|
509 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
510 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
511 0, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
512 code_memberlist, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
513 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
514 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
515 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
516 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
517 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
518 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
519 0, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
520 0, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
521 code_new, /* tp_new */ |
| 35742 | 522 }; |
| 523 | |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
524 /* 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
|
525 lnotab_notes.txt for the details of the lnotab representation. |
| 35742 | 526 */ |
| 527 | |
| 528 int | |
| 529 PyCode_Addr2Line(PyCodeObject *co, int addrq) | |
| 530 { | |
|
67347
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65494
diff
changeset
|
531 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
|
532 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
|
533 int line = co->co_firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
534 int addr = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
535 while (--size >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
536 addr += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
537 if (addr > addrq) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
538 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
539 line += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
540 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
541 return line; |
| 35742 | 542 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
543 |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
544 /* 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
|
545 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
|
546 int |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55580
diff
changeset
|
547 _PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
548 { |
|
67347
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65494
diff
changeset
|
549 Py_ssize_t size; |
|
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65494
diff
changeset
|
550 int addr, line; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
551 unsigned char* p; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
552 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
553 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
|
554 size = PyBytes_GET_SIZE(co->co_lnotab) / 2; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
555 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
556 addr = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
557 line = co->co_firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
558 assert(line > 0); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
559 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
560 /* 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
|
561 (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
|
562 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
|
563 somwhere we could skip the first while loop. */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
564 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61346
diff
changeset
|
565 /* 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
|
566 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
|
567 come in (addr, line) pairs. */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
568 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
569 bounds->ap_lower = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
570 while (size > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
571 if (addr + *p > lasti) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
572 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
573 addr += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
574 if (*p) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
575 bounds->ap_lower = addr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
576 line += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
577 --size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
578 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
579 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
580 if (size > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
581 while (--size >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
582 addr += *p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
583 if (*p++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
584 break; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
585 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
586 bounds->ap_upper = addr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
587 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
588 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
589 bounds->ap_upper = INT_MAX; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
590 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
591 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55580
diff
changeset
|
592 return line; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
593 } |
