Showing the changes to sys/src/cmd/python/Include/code.h (1 of 3706 files). Show all
Unified · Split
| @@ -0,0 +1,94 @@ | ||
| 1 | +/* Definitions for bytecode */ | |
| 2 | + | |
| 3 | +#ifndef Py_CODE_H | |
| 4 | +#define Py_CODE_H | |
| 5 | +#ifdef __cplusplus | |
| 6 | +extern "C" { | |
| 7 | +#endif | |
| 8 | + | |
| 9 | +/* Bytecode object */ | |
| 10 | +typedef struct { | |
| 11 | + PyObject_HEAD | |
| 12 | + int co_argcount; /* #arguments, except *args */ | |
| 13 | + int co_nlocals; /* #local variables */ | |
| 14 | + int co_stacksize; /* #entries needed for evaluation stack */ | |
| 15 | + int co_flags; /* CO_..., see below */ | |
| 16 | + PyObject *co_code; /* instruction opcodes */ | |
| 17 | + PyObject *co_consts; /* list (constants used) */ | |
| 18 | + PyObject *co_names; /* list of strings (names used) */ | |
| 19 | + PyObject *co_varnames; /* tuple of strings (local variable names) */ | |
| 20 | + PyObject *co_freevars; /* tuple of strings (free variable names) */ | |
| 21 | + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ | |
| 22 | + /* The rest doesn't count for hash/cmp */ | |
| 23 | + PyObject *co_filename; /* string (where it was loaded from) */ | |
| 24 | + PyObject *co_name; /* string (name, for reference) */ | |
| 25 | + int co_firstlineno; /* first source line number */ | |
| 26 | + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) */ | |
| 27 | + void *co_zombieframe; /* for optimization only (see frameobject.c) */ | |
| 28 | +} PyCodeObject; | |
| 29 | + | |
| 30 | +/* Masks for co_flags above */ | |
| 31 | +#define CO_OPTIMIZED 0x0001 | |
| 32 | +#define CO_NEWLOCALS 0x0002 | |
| 33 | +#define CO_VARARGS 0x0004 | |
| 34 | +#define CO_VARKEYWORDS 0x0008 | |
| 35 | +#define CO_NESTED 0x0010 | |
| 36 | +#define CO_GENERATOR 0x0020 | |
| 37 | +/* The CO_NOFREE flag is set if there are no free or cell variables. | |
| 38 | + This information is redundant, but it allows a single flag test | |
| 39 | + to determine whether there is any extra work to be done when the | |
| 40 | + call frame it setup. | |
| 41 | +*/ | |
| 42 | +#define CO_NOFREE 0x0040 | |
| 43 | + | |
| 44 | +#if 0 | |
| 45 | +/* This is no longer used. Stopped defining in 2.5, do not re-use. */ | |
| 46 | +#define CO_GENERATOR_ALLOWED 0x1000 | |
| 47 | +#endif | |
| 48 | +#define CO_FUTURE_DIVISION 0x2000 | |
| 49 | +#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */ | |
| 50 | +#define CO_FUTURE_WITH_STATEMENT 0x8000 | |
| 51 | + | |
| 52 | +/* This should be defined if a future statement modifies the syntax. | |
| 53 | + For example, when a keyword is added. | |
| 54 | +*/ | |
| 55 | +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD | |
| 56 | + | |
| 57 | +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ | |
| 58 | + | |
| 59 | +PyAPI_DATA(PyTypeObject) PyCode_Type; | |
| 60 | + | |
| 61 | +#define PyCode_Check(op) ((op)->ob_type == &PyCode_Type) | |
| 62 | +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) | |
| 63 | + | |
| 64 | +/* Public interface */ | |
| 65 | +PyAPI_FUNC(PyCodeObject *) PyCode_New( | |
| 66 | + int, int, int, int, PyObject *, PyObject *, PyObject *, PyObject *, | |
| 67 | + PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *); | |
| 68 | + /* same as struct above */ | |
| 69 | +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); | |
| 70 | + | |
| 71 | +/* for internal use only */ | |
| 72 | +#define _PyCode_GETCODEPTR(co, pp) \ | |
| 73 | + ((*(co)->co_code->ob_type->tp_as_buffer->bf_getreadbuffer) \ | |
| 74 | + ((co)->co_code, 0, (void **)(pp))) | |
| 75 | + | |
| 76 | +typedef struct _addr_pair { | |
| 77 | + int ap_lower; | |
| 78 | + int ap_upper; | |
| 79 | +} PyAddrPair; | |
| 80 | + | |
| 81 | +/* Check whether lasti (an instruction offset) falls outside bounds | |
| 82 | + and whether it is a line number that should be traced. Returns | |
| 83 | + a line number if it should be traced or -1 if the line should not. | |
| 84 | + | |
| 85 | + If lasti is not within bounds, updates bounds. | |
| 86 | +*/ | |
| 87 | + | |
| 88 | +PyAPI_FUNC(int) PyCode_CheckLineNumber(PyCodeObject* co, | |
| 89 | + int lasti, PyAddrPair *bounds); | |
| 90 | + | |
| 91 | +#ifdef __cplusplus | |
| 92 | +} | |
| 93 | +#endif | |
| 94 | +#endif /* !Py_CODE_H */ | |