blob: bdbfaba28cbbd0f7eb74314ce54be6ac8ee8350a [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/* Definitions for bytecode */
2
3#ifndef Py_CODE_H
4#define Py_CODE_H
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9/* Bytecode object */
10typedef struct {
11 PyObject_HEAD
12 int co_argcount; /* #arguments, except *args */
Guido van Rossum4f72a782006-10-27 23:31:49 +000013 int co_kwonlyargcount; /* #keyword only arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014 int co_nlocals; /* #local variables */
15 int co_stacksize; /* #entries needed for evaluation stack */
16 int co_flags; /* CO_..., see below */
17 PyObject *co_code; /* instruction opcodes */
18 PyObject *co_consts; /* list (constants used) */
19 PyObject *co_names; /* list of strings (names used) */
20 PyObject *co_varnames; /* tuple of strings (local variable names) */
21 PyObject *co_freevars; /* tuple of strings (free variable names) */
22 PyObject *co_cellvars; /* tuple of strings (cell variable names) */
Mark Dickinsonc008a172009-02-01 13:59:22 +000023 /* The rest doesn't count for hash or comparisons */
Guido van Rossum00bc0e02007-10-15 02:52:41 +000024 PyObject *co_filename; /* unicode (where it was loaded from) */
25 PyObject *co_name; /* unicode (name, for reference) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026 int co_firstlineno; /* first source line number */
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +000027 PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See
28 Objects/lnotab_notes.txt for details. */
Thomas Wouters477c8d52006-05-27 19:21:47 +000029 void *co_zombieframe; /* for optimization only (see frameobject.c) */
Collin Winter4222e9c2010-03-18 22:46:40 +000030 PyObject *co_weakreflist; /* to support weakrefs to code objects */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000031} PyCodeObject;
32
33/* Masks for co_flags above */
34#define CO_OPTIMIZED 0x0001
35#define CO_NEWLOCALS 0x0002
36#define CO_VARARGS 0x0004
37#define CO_VARKEYWORDS 0x0008
38#define CO_NESTED 0x0010
39#define CO_GENERATOR 0x0020
40/* The CO_NOFREE flag is set if there are no free or cell variables.
41 This information is redundant, but it allows a single flag test
42 to determine whether there is any extra work to be done when the
43 call frame it setup.
44*/
45#define CO_NOFREE 0x0040
Neal Norwitz0090a4c2006-02-19 18:49:30 +000046
Guido van Rossum45aecf42006-03-15 04:58:47 +000047/* These are no longer used. */
Benjamin Petersonffeaa882009-07-02 21:54:36 +000048#if 0
Neal Norwitzab51f5f2006-02-25 15:43:10 +000049#define CO_GENERATOR_ALLOWED 0x1000
Benjamin Petersonffeaa882009-07-02 21:54:36 +000050#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000051#define CO_FUTURE_DIVISION 0x2000
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000052#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */
Thomas Wouters34aa7ba2006-02-28 19:02:24 +000053#define CO_FUTURE_WITH_STATEMENT 0x8000
Eric Smith87824082008-03-20 23:02:08 +000054#define CO_FUTURE_PRINT_FUNCTION 0x10000
Christian Heimes4d6ec852008-03-26 22:34:47 +000055#define CO_FUTURE_UNICODE_LITERALS 0x20000
Thomas Wouters34aa7ba2006-02-28 19:02:24 +000056
Brett Cannone3944a52009-04-01 05:08:41 +000057#define CO_FUTURE_BARRY_AS_BDFL 0x40000
58
Thomas Wouters34aa7ba2006-02-28 19:02:24 +000059/* This should be defined if a future statement modifies the syntax.
60 For example, when a keyword is added.
61*/
Brett Cannone3944a52009-04-01 05:08:41 +000062#define PY_PARSER_REQUIRES_FUTURE_KEYWORD
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000063
64#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
65
Neal Norwitz58a79852005-10-21 04:23:36 +000066PyAPI_DATA(PyTypeObject) PyCode_Type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000067
Christian Heimes90aa7642007-12-19 02:45:37 +000068#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000069#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars))
70
71/* Public interface */
Neal Norwitz58a79852005-10-21 04:23:36 +000072PyAPI_FUNC(PyCodeObject *) PyCode_New(
Guido van Rossum4f72a782006-10-27 23:31:49 +000073 int, int, int, int, int, PyObject *, PyObject *,
74 PyObject *, PyObject *, PyObject *, PyObject *,
75 PyObject *, PyObject *, int, PyObject *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000076 /* same as struct above */
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +000077
78/* Creates a new empty code object with the specified source location. */
79PyAPI_FUNC(PyCodeObject *)
80PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);
81
82/* Return the line number associated with the specified bytecode index
83 in this code object. If you just need the line number of a frame,
84 use PyFrame_GetLineNumber() instead. */
Neal Norwitz58a79852005-10-21 04:23:36 +000085PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086
87/* for internal use only */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000088typedef struct _addr_pair {
89 int ap_lower;
90 int ap_upper;
91} PyAddrPair;
92
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +000093/* Update *bounds to describe the first and one-past-the-last instructions in the
94 same line as lasti. Return the number of that line.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000095*/
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +000096PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co,
97 int lasti, PyAddrPair *bounds);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000098
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000099PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
100 PyObject *names, PyObject *lineno_obj);
101
Victor Stinnerc39211f2010-09-29 16:35:47 +0000102/* List of weak references to all code objects. The list is used by
103 initfsencoding() to redecode code filenames at startup if the filesystem
104 encoding changes. At initfsencoding() exit, the list is set to NULL and it
105 is no more used. */
106
107extern PyObject *_Py_code_object_list;
108
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109#ifdef __cplusplus
110}
111#endif
112#endif /* !Py_CODE_H */