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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 #include "Python.h"
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2 #include "code.h"
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 #include "structmember.h"
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 /* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 static int
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
11 all_name_chars(PyObject *o)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
15 PyUnicodeObject *u = (PyUnicodeObject *)o;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
16 const unsigned char *s;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
17
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
18 if (!PyUnicode_Check(o) || PyUnicode_READY(u) == -1 ||
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
19 PyUnicode_MAX_CHAR_VALUE(u) >= 128)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
20 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36 intern_strings(PyObject *tuple)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
156 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
205
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
206 #define OFF(x) offsetof(PyCodeObject, x)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
207
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
225 };
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
226
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
227 /* Helper for code_new: return a shallow copy of a tuple that is
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
228 guaranteed to contain exact strings, by converting string subclasses
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
229 to exact strings and complaining if a non-string is found. */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
230 static PyObject*
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
231 validate_and_copy_tuple(PyObject *tup)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
265
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55580
diff changeset
266 return newtuple;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
267 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
268
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
273 \n\
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
274 Create a code object. Not for the faint of heart.");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
275
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
276 static PyObject *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
277 code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
359 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
360
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
361 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
362 code_dealloc(PyCodeObject *co)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
380 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
381
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
394 code_repr(PyCodeObject *co)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
410 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
470 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
473 code_hash(PyCodeObject *co)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
495 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
496
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
497 /* XXX code objects need to participate in GC? */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
543 };
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
547 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
548
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
549 int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
550 PyCode_Addr2Line(PyCodeObject *co, int addrq)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
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 }