blob: 7bd292a8888c6557b58342d1a10e7480c5594186 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001#include "Python.h"
2#include "code.h"
3#include "structmember.h"
4
5#define NAME_CHARS \
6 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
7
8/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
9
10static int
11all_name_chars(unsigned char *s)
12{
13 static char ok_name_char[256];
14 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
15
16 if (ok_name_char[*name_chars] == 0) {
17 unsigned char *p;
18 for (p = name_chars; *p; p++)
19 ok_name_char[*p] = 1;
20 }
21 while (*s) {
22 if (ok_name_char[*s++] == 0)
23 return 0;
24 }
25 return 1;
26}
27
28static void
29intern_strings(PyObject *tuple)
30{
Martin v. Löwis18e16552006-02-15 17:27:45 +000031 Py_ssize_t i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
34 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Martin v. Löwis5b222132007-06-10 09:51:05 +000035 if (v == NULL || !PyUnicode_CheckExact(v)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000036 Py_FatalError("non-string found in code slot");
37 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000038 PyUnicode_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000039 }
40}
41
42
43PyCodeObject *
Guido van Rossum4f72a782006-10-27 23:31:49 +000044PyCode_New(int argcount, int kwonlyargcount,
45 int nlocals, int stacksize, int flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000046 PyObject *code, PyObject *consts, PyObject *names,
47 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
48 PyObject *filename, PyObject *name, int firstlineno,
49 PyObject *lnotab)
50{
51 PyCodeObject *co;
Martin v. Löwis18e16552006-02-15 17:27:45 +000052 Py_ssize_t i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053 /* Check argument types */
54 if (argcount < 0 || nlocals < 0 ||
55 code == NULL ||
56 consts == NULL || !PyTuple_Check(consts) ||
57 names == NULL || !PyTuple_Check(names) ||
58 varnames == NULL || !PyTuple_Check(varnames) ||
59 freevars == NULL || !PyTuple_Check(freevars) ||
60 cellvars == NULL || !PyTuple_Check(cellvars) ||
Martin v. Löwis5b222132007-06-10 09:51:05 +000061 name == NULL || (!PyString_Check(name) && !PyUnicode_Check(name)) ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000062 filename == NULL || !PyString_Check(filename) ||
63 lnotab == NULL || !PyString_Check(lnotab) ||
64 !PyObject_CheckReadBuffer(code)) {
65 PyErr_BadInternalCall();
66 return NULL;
67 }
Neal Norwitz41103bf2007-08-24 23:12:06 +000068 if (PyString_Check(name)) {
69 name = PyUnicode_FromString(PyString_AS_STRING(name));
70 if (name == NULL)
71 return NULL;
72 } else {
73 Py_INCREF(name);
74 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075 intern_strings(names);
76 intern_strings(varnames);
77 intern_strings(freevars);
78 intern_strings(cellvars);
79 /* Intern selected string constants */
80 for (i = PyTuple_Size(consts); --i >= 0; ) {
81 PyObject *v = PyTuple_GetItem(consts, i);
82 if (!PyString_Check(v))
83 continue;
84 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
85 continue;
86 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
87 }
88 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
89 if (co != NULL) {
90 co->co_argcount = argcount;
Guido van Rossum4f72a782006-10-27 23:31:49 +000091 co->co_kwonlyargcount = kwonlyargcount;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 co->co_nlocals = nlocals;
93 co->co_stacksize = stacksize;
94 co->co_flags = flags;
95 Py_INCREF(code);
96 co->co_code = code;
97 Py_INCREF(consts);
98 co->co_consts = consts;
99 Py_INCREF(names);
100 co->co_names = names;
101 Py_INCREF(varnames);
102 co->co_varnames = varnames;
103 Py_INCREF(freevars);
104 co->co_freevars = freevars;
105 Py_INCREF(cellvars);
106 co->co_cellvars = cellvars;
107 Py_INCREF(filename);
108 co->co_filename = filename;
109 Py_INCREF(name);
110 co->co_name = name;
111 co->co_firstlineno = firstlineno;
112 Py_INCREF(lnotab);
113 co->co_lnotab = lnotab;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114 co->co_zombieframe = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 }
Neal Norwitz41103bf2007-08-24 23:12:06 +0000116 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000117 return co;
118}
119
120
121#define OFF(x) offsetof(PyCodeObject, x)
122
123static PyMemberDef code_memberlist[] = {
124 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
Guido van Rossum4f72a782006-10-27 23:31:49 +0000125 {"co_kwonlyargcount", T_INT, OFF(co_kwonlyargcount), READONLY},
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
127 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
128 {"co_flags", T_INT, OFF(co_flags), READONLY},
129 {"co_code", T_OBJECT, OFF(co_code), READONLY},
130 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
131 {"co_names", T_OBJECT, OFF(co_names), READONLY},
132 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
133 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
134 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
135 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
136 {"co_name", T_OBJECT, OFF(co_name), READONLY},
137 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
138 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
139 {NULL} /* Sentinel */
140};
141
142/* Helper for code_new: return a shallow copy of a tuple that is
143 guaranteed to contain exact strings, by converting string subclasses
144 to exact strings and complaining if a non-string is found. */
145static PyObject*
146validate_and_copy_tuple(PyObject *tup)
147{
148 PyObject *newtuple;
149 PyObject *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000150 Py_ssize_t i, len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000151
152 len = PyTuple_GET_SIZE(tup);
153 newtuple = PyTuple_New(len);
154 if (newtuple == NULL)
155 return NULL;
156
157 for (i = 0; i < len; i++) {
158 item = PyTuple_GET_ITEM(tup, i);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000159 if (PyUnicode_CheckExact(item)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000160 Py_INCREF(item);
161 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000162 else if (!PyUnicode_Check(item)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000163 PyErr_Format(
164 PyExc_TypeError,
165 "name tuples must contain only "
166 "strings, not '%.500s'",
167 item->ob_type->tp_name);
168 Py_DECREF(newtuple);
169 return NULL;
170 }
171 else {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000172 item = PyUnicode_FromUnicode(
173 PyUnicode_AS_UNICODE(item),
174 PyUnicode_GET_SIZE(item));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000175 if (item == NULL) {
176 Py_DECREF(newtuple);
177 return NULL;
178 }
179 }
180 PyTuple_SET_ITEM(newtuple, i, item);
181 }
182
183 return newtuple;
184}
185
186PyDoc_STRVAR(code_doc,
187"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
188 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
189\n\
190Create a code object. Not for the faint of heart.");
191
192static PyObject *
193code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
194{
195 int argcount;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000196 int kwonlyargcount;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000197 int nlocals;
198 int stacksize;
199 int flags;
200 PyObject *co = NULL;
201 PyObject *code;
202 PyObject *consts;
203 PyObject *names, *ournames = NULL;
204 PyObject *varnames, *ourvarnames = NULL;
205 PyObject *freevars = NULL, *ourfreevars = NULL;
206 PyObject *cellvars = NULL, *ourcellvars = NULL;
207 PyObject *filename;
208 PyObject *name;
209 int firstlineno;
210 PyObject *lnotab;
211
Guido van Rossum4f72a782006-10-27 23:31:49 +0000212 if (!PyArg_ParseTuple(args, "iiiiiSO!O!O!SSiS|O!O!:code",
213 &argcount, &kwonlyargcount,
214 &nlocals, &stacksize, &flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215 &code,
216 &PyTuple_Type, &consts,
217 &PyTuple_Type, &names,
218 &PyTuple_Type, &varnames,
219 &filename, &name,
220 &firstlineno, &lnotab,
221 &PyTuple_Type, &freevars,
222 &PyTuple_Type, &cellvars))
223 return NULL;
224
225 if (argcount < 0) {
226 PyErr_SetString(
227 PyExc_ValueError,
228 "code: argcount must not be negative");
229 goto cleanup;
230 }
231
Guido van Rossum4f72a782006-10-27 23:31:49 +0000232 if (kwonlyargcount < 0) {
233 PyErr_SetString(
234 PyExc_ValueError,
235 "code: kwonlyargcount must not be negative");
236 goto cleanup;
237 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 if (nlocals < 0) {
239 PyErr_SetString(
240 PyExc_ValueError,
241 "code: nlocals must not be negative");
242 goto cleanup;
243 }
244
245 ournames = validate_and_copy_tuple(names);
246 if (ournames == NULL)
247 goto cleanup;
248 ourvarnames = validate_and_copy_tuple(varnames);
249 if (ourvarnames == NULL)
250 goto cleanup;
251 if (freevars)
252 ourfreevars = validate_and_copy_tuple(freevars);
253 else
254 ourfreevars = PyTuple_New(0);
255 if (ourfreevars == NULL)
256 goto cleanup;
257 if (cellvars)
258 ourcellvars = validate_and_copy_tuple(cellvars);
259 else
260 ourcellvars = PyTuple_New(0);
261 if (ourcellvars == NULL)
262 goto cleanup;
263
Guido van Rossum4f72a782006-10-27 23:31:49 +0000264 co = (PyObject *)PyCode_New(argcount, kwonlyargcount,
265 nlocals, stacksize, flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 code, consts, ournames, ourvarnames,
267 ourfreevars, ourcellvars, filename,
268 name, firstlineno, lnotab);
269 cleanup:
270 Py_XDECREF(ournames);
271 Py_XDECREF(ourvarnames);
272 Py_XDECREF(ourfreevars);
273 Py_XDECREF(ourcellvars);
274 return co;
275}
276
277static void
278code_dealloc(PyCodeObject *co)
279{
280 Py_XDECREF(co->co_code);
281 Py_XDECREF(co->co_consts);
282 Py_XDECREF(co->co_names);
283 Py_XDECREF(co->co_varnames);
284 Py_XDECREF(co->co_freevars);
285 Py_XDECREF(co->co_cellvars);
286 Py_XDECREF(co->co_filename);
287 Py_XDECREF(co->co_name);
288 Py_XDECREF(co->co_lnotab);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000289 if (co->co_zombieframe != NULL)
290 PyObject_GC_Del(co->co_zombieframe);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 PyObject_DEL(co);
292}
293
294static PyObject *
295code_repr(PyCodeObject *co)
296{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000297 int lineno = -1;
298 char *filename = "???";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299
300 if (co->co_firstlineno != 0)
301 lineno = co->co_firstlineno;
302 if (co->co_filename && PyString_Check(co->co_filename))
303 filename = PyString_AS_STRING(co->co_filename);
Walter Dörwald933daed2007-06-06 15:15:34 +0000304 return PyUnicode_FromFormat(
Neal Norwitz41103bf2007-08-24 23:12:06 +0000305 "<code object %.100U at %p, file \"%.300s\", line %d>",
306 co->co_name, co, filename, lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000307}
308
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000309static PyObject *
310code_richcompare(PyObject *self, PyObject *other, int op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311{
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000312 PyCodeObject *co, *cp;
313 int eq;
314 PyObject *res;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000315
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000316 if ((op != Py_EQ && op != Py_NE) ||
317 !PyCode_Check(self) ||
318 !PyCode_Check(other)) {
319 Py_INCREF(Py_NotImplemented);
320 return Py_NotImplemented;
321 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000322
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000323 co = (PyCodeObject *)self;
324 cp = (PyCodeObject *)other;
325
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000326 eq = PyObject_RichCompareBool(co->co_name, cp->co_name, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000327 if (eq <= 0) goto unequal;
328 eq = co->co_argcount == cp->co_argcount;
329 if (!eq) goto unequal;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000330 eq = co->co_kwonlyargcount == cp->co_kwonlyargcount;
331 if (!eq) goto unequal;
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000332 eq = co->co_nlocals == cp->co_nlocals;
333 if (!eq) goto unequal;
334 eq = co->co_flags == cp->co_flags;
335 if (!eq) goto unequal;
336 eq = co->co_firstlineno == cp->co_firstlineno;
337 if (!eq) goto unequal;
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000338 eq = PyObject_RichCompareBool(co->co_code, cp->co_code, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000339 if (eq <= 0) goto unequal;
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000340 eq = PyObject_RichCompareBool(co->co_consts, cp->co_consts, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000341 if (eq <= 0) goto unequal;
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000342 eq = PyObject_RichCompareBool(co->co_names, cp->co_names, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000343 if (eq <= 0) goto unequal;
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000344 eq = PyObject_RichCompareBool(co->co_varnames, cp->co_varnames, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000345 if (eq <= 0) goto unequal;
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000346 eq = PyObject_RichCompareBool(co->co_freevars, cp->co_freevars, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000347 if (eq <= 0) goto unequal;
Guido van Rossumf1624cd2006-08-24 23:43:52 +0000348 eq = PyObject_RichCompareBool(co->co_cellvars, cp->co_cellvars, Py_EQ);
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000349 if (eq <= 0) goto unequal;
350
351 if (op == Py_EQ)
352 res = Py_True;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 else
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000354 res = Py_False;
355 goto done;
356
357 unequal:
358 if (eq < 0)
359 return NULL;
360 if (op == Py_NE)
361 res = Py_True;
362 else
363 res = Py_False;
364
365 done:
366 Py_INCREF(res);
367 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368}
369
370static long
371code_hash(PyCodeObject *co)
372{
373 long h, h0, h1, h2, h3, h4, h5, h6;
374 h0 = PyObject_Hash(co->co_name);
375 if (h0 == -1) return -1;
376 h1 = PyObject_Hash(co->co_code);
377 if (h1 == -1) return -1;
378 h2 = PyObject_Hash(co->co_consts);
379 if (h2 == -1) return -1;
380 h3 = PyObject_Hash(co->co_names);
381 if (h3 == -1) return -1;
382 h4 = PyObject_Hash(co->co_varnames);
383 if (h4 == -1) return -1;
384 h5 = PyObject_Hash(co->co_freevars);
385 if (h5 == -1) return -1;
386 h6 = PyObject_Hash(co->co_cellvars);
387 if (h6 == -1) return -1;
388 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum4f72a782006-10-27 23:31:49 +0000389 co->co_argcount ^ co->co_kwonlyargcount ^
390 co->co_nlocals ^ co->co_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000391 if (h == -1) h = -2;
392 return h;
393}
394
395/* XXX code objects need to participate in GC? */
396
397PyTypeObject PyCode_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000398 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000399 "code",
400 sizeof(PyCodeObject),
401 0,
402 (destructor)code_dealloc, /* tp_dealloc */
403 0, /* tp_print */
404 0, /* tp_getattr */
405 0, /* tp_setattr */
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000406 0, /* tp_compare */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 (reprfunc)code_repr, /* tp_repr */
408 0, /* tp_as_number */
409 0, /* tp_as_sequence */
410 0, /* tp_as_mapping */
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000411 (hashfunc)code_hash, /* tp_hash */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412 0, /* tp_call */
413 0, /* tp_str */
414 PyObject_GenericGetAttr, /* tp_getattro */
415 0, /* tp_setattro */
416 0, /* tp_as_buffer */
417 Py_TPFLAGS_DEFAULT, /* tp_flags */
418 code_doc, /* tp_doc */
419 0, /* tp_traverse */
420 0, /* tp_clear */
Guido van Rossumb6bb0c72006-08-24 04:12:18 +0000421 code_richcompare, /* tp_richcompare */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 0, /* tp_weaklistoffset */
423 0, /* tp_iter */
424 0, /* tp_iternext */
425 0, /* tp_methods */
426 code_memberlist, /* tp_members */
427 0, /* tp_getset */
428 0, /* tp_base */
429 0, /* tp_dict */
430 0, /* tp_descr_get */
431 0, /* tp_descr_set */
432 0, /* tp_dictoffset */
433 0, /* tp_init */
434 0, /* tp_alloc */
435 code_new, /* tp_new */
436};
437
438/* All about c_lnotab.
439
440c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
441mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
442to source code line #s (when needed for tracebacks) via c_lnotab instead.
443The array is conceptually a list of
444 (bytecode offset increment, line number increment)
445pairs. The details are important and delicate, best illustrated by example:
446
447 byte code offset source code line number
448 0 1
449 6 2
450 50 7
451 350 307
452 361 308
453
454The first trick is that these numbers aren't stored, only the increments
455from one row to the next (this doesn't really work, but it's a start):
456
457 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
458
459The second trick is that an unsigned byte can't hold negative values, or
460values larger than 255, so (a) there's a deep assumption that byte code
461offsets and their corresponding line #s both increase monotonically, and (b)
462if at least one column jumps by more than 255 from one row to the next, more
463than one pair is written to the table. In case #b, there's no way to know
464from looking at the table later how many were written. That's the delicate
465part. A user of c_lnotab desiring to find the source line number
466corresponding to a bytecode address A should do something like this
467
468 lineno = addr = 0
469 for addr_incr, line_incr in c_lnotab:
470 addr += addr_incr
471 if addr > A:
472 return lineno
473 lineno += line_incr
474
475In order for this to work, when the addr field increments by more than 255,
476the line # increment in each pair generated must be 0 until the remaining addr
477increment is < 256. So, in the example above, com_set_lineno should not (as
478was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
479255, 0, 45, 255, 0, 45.
480*/
481
482int
483PyCode_Addr2Line(PyCodeObject *co, int addrq)
484{
485 int size = PyString_Size(co->co_lnotab) / 2;
486 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
487 int line = co->co_firstlineno;
488 int addr = 0;
489 while (--size >= 0) {
490 addr += *p++;
491 if (addr > addrq)
492 break;
493 line += *p++;
494 }
495 return line;
496}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000497
498/*
499 Check whether the current instruction is at the start of a line.
500
501 */
502
503 /* The theory of SET_LINENO-less tracing.
504
505 In a nutshell, we use the co_lnotab field of the code object
506 to tell when execution has moved onto a different line.
507
508 As mentioned above, the basic idea is so set things up so
509 that
510
511 *instr_lb <= frame->f_lasti < *instr_ub
512
513 is true so long as execution does not change lines.
514
515 This is all fairly simple. Digging the information out of
516 co_lnotab takes some work, but is conceptually clear.
517
518 Somewhat harder to explain is why we don't *always* call the
519 line trace function when the above test fails.
520
521 Consider this code:
522
523 1: def f(a):
524 2: if a:
525 3: print 1
526 4: else:
527 5: print 2
528
529 which compiles to this:
530
531 2 0 LOAD_FAST 0 (a)
532 3 JUMP_IF_FALSE 9 (to 15)
533 6 POP_TOP
534
535 3 7 LOAD_CONST 1 (1)
536 10 PRINT_ITEM
537 11 PRINT_NEWLINE
538 12 JUMP_FORWARD 6 (to 21)
539 >> 15 POP_TOP
540
541 5 16 LOAD_CONST 2 (2)
542 19 PRINT_ITEM
543 20 PRINT_NEWLINE
544 >> 21 LOAD_CONST 0 (None)
545 24 RETURN_VALUE
546
547 If 'a' is false, execution will jump to instruction at offset
548 15 and the co_lnotab will claim that execution has moved to
549 line 3. This is at best misleading. In this case we could
550 associate the POP_TOP with line 4, but that doesn't make
551 sense in all cases (I think).
552
553 What we do is only call the line trace function if the co_lnotab
554 indicates we have jumped to the *start* of a line, i.e. if the
555 current instruction offset matches the offset given for the
556 start of a line by the co_lnotab.
557
558 This also takes care of the situation where 'a' is true.
559 Execution will jump from instruction offset 12 to offset 21.
560 Then the co_lnotab would imply that execution has moved to line
561 5, which is again misleading.
562
563 Why do we set f_lineno when tracing? Well, consider the code
564 above when 'a' is true. If stepping through this with 'n' in
565 pdb, you would stop at line 1 with a "call" type event, then
566 line events on lines 2 and 3, then a "return" type event -- but
567 you would be shown line 5 during this event. This is a change
568 from the behaviour in 2.2 and before, and I've found it
569 confusing in practice. By setting and using f_lineno when
570 tracing, one can report a line number different from that
571 suggested by f_lasti on this one occasion where it's desirable.
572 */
573
574
575int
576PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds)
577{
578 int size, addr, line;
579 unsigned char* p;
580
581 p = (unsigned char*)PyString_AS_STRING(co->co_lnotab);
582 size = PyString_GET_SIZE(co->co_lnotab) / 2;
583
584 addr = 0;
585 line = co->co_firstlineno;
586 assert(line > 0);
587
588 /* possible optimization: if f->f_lasti == instr_ub
589 (likely to be a common case) then we already know
590 instr_lb -- if we stored the matching value of p
591 somwhere we could skip the first while loop. */
592
593 /* see comments in compile.c for the description of
594 co_lnotab. A point to remember: increments to p
595 should come in pairs -- although we don't care about
596 the line increments here, treating them as byte
597 increments gets confusing, to say the least. */
598
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000599 bounds->ap_lower = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000600 while (size > 0) {
601 if (addr + *p > lasti)
602 break;
603 addr += *p++;
604 if (*p)
605 bounds->ap_lower = addr;
606 line += *p++;
607 --size;
608 }
609
610 /* If lasti and addr don't match exactly, we don't want to
611 change the lineno slot on the frame or execute a trace
612 function. Return -1 instead.
613 */
614 if (addr != lasti)
615 line = -1;
616
617 if (size > 0) {
618 while (--size >= 0) {
619 addr += *p++;
620 if (*p++)
621 break;
622 }
623 bounds->ap_upper = addr;
624 }
625 else {
626 bounds->ap_upper = INT_MAX;
627 }
628
629 return line;
630}