mirror of
https://github.com/python/cpython
synced 2024-11-05 18:12:54 +00:00
7b82b40a47
svn+ssh://pythondev@svn.python.org/python/trunk ........ r72487 | jeffrey.yasskin | 2009-05-08 17:51:06 -0400 (Fri, 08 May 2009) | 7 lines PyCode_NewEmpty: Most uses of PyCode_New found by http://www.google.com/codesearch?q=PyCode_New are trying to build an empty code object, usually to put it in a dummy frame object. This patch adds a PyCode_NewEmpty wrapper which lets the user specify just the filename, function name, and first line number, instead of also requiring lots of code internals. ........ r72488 | jeffrey.yasskin | 2009-05-08 18:23:21 -0400 (Fri, 08 May 2009) | 13 lines Issue 5954, PyFrame_GetLineNumber: Most uses of PyCode_Addr2Line (http://www.google.com/codesearch?q=PyCode_Addr2Line) are just trying to get the line number of a specified frame, but there's no way to do that directly. Forcing people to go through the code object makes them know more about the guts of the interpreter than they should need. The remaining uses of PyCode_Addr2Line seem to be getting the line from a traceback (for example, http://www.google.com/codesearch/p?hl=en#u_9_nDrchrw/pygame-1.7.1release/src/base.c&q=PyCode_Addr2Line), which is replaced by the tb_lineno field. So we may be able to deprecate PyCode_Addr2Line entirely for external use. ........ r72879 | jeffrey.yasskin | 2009-05-23 19:23:01 -0400 (Sat, 23 May 2009) | 14 lines Issue #6042: lnotab-based tracing is very complicated and isn't documented very well. There were at least 3 comment blocks purporting to document co_lnotab, and none did a very good job. This patch unifies them into Objects/lnotab_notes.txt which tries to completely capture the current state of affairs. I also discovered that we've attached 2 layers of patches to the basic tracing scheme. The first layer avoids jumping to instructions that don't start a line, to avoid problems in if statements and while loops. The second layer discovered that jumps backward do need to trace at instructions that don't start a line, so it added extra lnotab entries for 'while' and 'for' loops, and added a special case for backward jumps within the same line. I replaced these patches by just treating forward and backward jumps differently. ........
104 lines
3.7 KiB
C
104 lines
3.7 KiB
C
/* Definitions for bytecode */
|
|
|
|
#ifndef Py_CODE_H
|
|
#define Py_CODE_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Bytecode object */
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
int co_argcount; /* #arguments, except *args */
|
|
int co_kwonlyargcount; /* #keyword only arguments */
|
|
int co_nlocals; /* #local variables */
|
|
int co_stacksize; /* #entries needed for evaluation stack */
|
|
int co_flags; /* CO_..., see below */
|
|
PyObject *co_code; /* instruction opcodes */
|
|
PyObject *co_consts; /* list (constants used) */
|
|
PyObject *co_names; /* list of strings (names used) */
|
|
PyObject *co_varnames; /* tuple of strings (local variable names) */
|
|
PyObject *co_freevars; /* tuple of strings (free variable names) */
|
|
PyObject *co_cellvars; /* tuple of strings (cell variable names) */
|
|
/* The rest doesn't count for hash or comparisons */
|
|
PyObject *co_filename; /* unicode (where it was loaded from) */
|
|
PyObject *co_name; /* unicode (name, for reference) */
|
|
int co_firstlineno; /* first source line number */
|
|
PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See
|
|
Objects/lnotab_notes.txt for details. */
|
|
void *co_zombieframe; /* for optimization only (see frameobject.c) */
|
|
} PyCodeObject;
|
|
|
|
/* Masks for co_flags above */
|
|
#define CO_OPTIMIZED 0x0001
|
|
#define CO_NEWLOCALS 0x0002
|
|
#define CO_VARARGS 0x0004
|
|
#define CO_VARKEYWORDS 0x0008
|
|
#define CO_NESTED 0x0010
|
|
#define CO_GENERATOR 0x0020
|
|
/* The CO_NOFREE flag is set if there are no free or cell variables.
|
|
This information is redundant, but it allows a single flag test
|
|
to determine whether there is any extra work to be done when the
|
|
call frame it setup.
|
|
*/
|
|
#define CO_NOFREE 0x0040
|
|
|
|
/* These are no longer used. */
|
|
#if 0
|
|
#define CO_GENERATOR_ALLOWED 0x1000
|
|
#endif
|
|
#define CO_FUTURE_DIVISION 0x2000
|
|
#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */
|
|
#define CO_FUTURE_WITH_STATEMENT 0x8000
|
|
#define CO_FUTURE_PRINT_FUNCTION 0x10000
|
|
#define CO_FUTURE_UNICODE_LITERALS 0x20000
|
|
|
|
#define CO_FUTURE_BARRY_AS_BDFL 0x40000
|
|
|
|
/* This should be defined if a future statement modifies the syntax.
|
|
For example, when a keyword is added.
|
|
*/
|
|
#define PY_PARSER_REQUIRES_FUTURE_KEYWORD
|
|
|
|
#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
|
|
|
|
PyAPI_DATA(PyTypeObject) PyCode_Type;
|
|
|
|
#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type)
|
|
#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars))
|
|
|
|
/* Public interface */
|
|
PyAPI_FUNC(PyCodeObject *) PyCode_New(
|
|
int, int, int, int, int, PyObject *, PyObject *,
|
|
PyObject *, PyObject *, PyObject *, PyObject *,
|
|
PyObject *, PyObject *, int, PyObject *);
|
|
/* same as struct above */
|
|
|
|
/* Creates a new empty code object with the specified source location. */
|
|
PyAPI_FUNC(PyCodeObject *)
|
|
PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);
|
|
|
|
/* Return the line number associated with the specified bytecode index
|
|
in this code object. If you just need the line number of a frame,
|
|
use PyFrame_GetLineNumber() instead. */
|
|
PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
|
|
|
|
/* for internal use only */
|
|
typedef struct _addr_pair {
|
|
int ap_lower;
|
|
int ap_upper;
|
|
} PyAddrPair;
|
|
|
|
/* Update *bounds to describe the first and one-past-the-last instructions in the
|
|
same line as lasti. Return the number of that line.
|
|
*/
|
|
PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co,
|
|
int lasti, PyAddrPair *bounds);
|
|
|
|
PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
|
|
PyObject *names, PyObject *lineno_obj);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_CODE_H */
|