bpo-40421: Add Include/cpython/code.h header file (GH-19756) · python/cpython@b8f704d (original) (raw)

1

1

`/* Definitions for bytecode */

`

2

2

``

3

``

`-

#ifndef Py_LIMITED_API

`

4

3

`#ifndef Py_CODE_H

`

5

4

`#define Py_CODE_H

`

6

5

`#ifdef __cplusplus

`

7

6

`extern "C" {

`

8

7

`#endif

`

9

8

``

10

``

`-

typedef uint16_t _Py_CODEUNIT;

`

11

``

-

12

``

`-

#ifdef WORDS_BIGENDIAN

`

13

``

`-

define _Py_OPCODE(word) ((word) >> 8)

`

14

``

`-

define _Py_OPARG(word) ((word) & 255)

`

15

``

`-

#else

`

16

``

`-

define _Py_OPCODE(word) ((word) & 255)

`

17

``

`-

define _Py_OPARG(word) ((word) >> 8)

`

18

``

`-

#endif

`

19

``

-

20

``

`-

typedef struct _PyOpcache _PyOpcache;

`

21

``

-

22

``

`-

/* Bytecode object */

`

23

``

`-

typedef struct {

`

24

``

`-

PyObject_HEAD

`

25

``

`-

int co_argcount; /* #arguments, except *args */

`

26

``

`-

int co_posonlyargcount; /* #positional only arguments */

`

27

``

`-

int co_kwonlyargcount; /* #keyword only arguments */

`

28

``

`-

int co_nlocals; /* #local variables */

`

29

``

`-

int co_stacksize; /* #entries needed for evaluation stack */

`

30

``

`-

int co_flags; /* CO_..., see below */

`

31

``

`-

int co_firstlineno; /* first source line number */

`

32

``

`-

PyObject co_code; / instruction opcodes */

`

33

``

`-

PyObject co_consts; / list (constants used) */

`

34

``

`-

PyObject co_names; / list of strings (names used) */

`

35

``

`-

PyObject co_varnames; / tuple of strings (local variable names) */

`

36

``

`-

PyObject co_freevars; / tuple of strings (free variable names) */

`

37

``

`-

PyObject co_cellvars; / tuple of strings (cell variable names) */

`

38

``

`-

/* The rest aren't used in either hash or comparisons, except for co_name,

`

39

``

`-

used in both. This is done to preserve the name and line number

`

40

``

`-

for tracebacks and debuggers; otherwise, constant de-duplication

`

41

``

`-

would collapse identical functions/lambdas defined on different lines.

`

42

``

`-

*/

`

43

``

`-

Py_ssize_t co_cell2arg; / Maps cell vars which are arguments. */

`

44

``

`-

PyObject co_filename; / unicode (where it was loaded from) */

`

45

``

`-

PyObject co_name; / unicode (name, for reference) */

`

46

``

`-

PyObject co_lnotab; / string (encoding addr<->lineno mapping) See

`

47

``

`-

Objects/lnotab_notes.txt for details. */

`

48

``

`-

void co_zombieframe; / for optimization only (see frameobject.c) */

`

49

``

`-

PyObject co_weakreflist; / to support weakrefs to code objects */

`

50

``

`-

/* Scratch space for extra data relating to the code object.

`

51

``

`-

Type is a void* to keep the format private in codeobject.c to force

`

52

``

`-

people to go through the proper APIs. */

`

53

``

`-

void *co_extra;

`

54

``

-

55

``

`-

/* Per opcodes just-in-time cache

`

56

``

`-

`

57

``

`-

`

58

``

`-

`

59

``

`-

`

60

``

`-

*/

`

61

``

-

62

``

`-

// co_opcache_map is indexed by (next_instr - first_instr).

`

63

``

`-

// * 0 means there is no cache for this opcode.

`

64

``

`-

// * n > 0 means there is cache in co_opcache[n-1].

`

65

``

`-

unsigned char *co_opcache_map;

`

66

``

`-

_PyOpcache *co_opcache;

`

67

``

`-

int co_opcache_flag; // used to determine when create a cache.

`

68

``

`-

unsigned char co_opcache_size; // length of co_opcache.

`

69

``

`-

} PyCodeObject;

`

70

``

-

71

``

`-

/* Masks for co_flags above */

`

72

``

`-

#define CO_OPTIMIZED 0x0001

`

73

``

`-

#define CO_NEWLOCALS 0x0002

`

74

``

`-

#define CO_VARARGS 0x0004

`

75

``

`-

#define CO_VARKEYWORDS 0x0008

`

76

``

`-

#define CO_NESTED 0x0010

`

77

``

`-

#define CO_GENERATOR 0x0020

`

78

``

`-

/* The CO_NOFREE flag is set if there are no free or cell variables.

`

79

``

`-

This information is redundant, but it allows a single flag test

`

80

``

`-

to determine whether there is any extra work to be done when the

`

81

``

`-

call frame it setup.

`

82

``

`-

*/

`

83

``

`-

#define CO_NOFREE 0x0040

`

84

``

-

85

``

`-

/* The CO_COROUTINE flag is set for coroutine functions (defined with

`

86

``


 ``async def`` keywords) */

87

``

`-

#define CO_COROUTINE 0x0080

`

88

``

`-

#define CO_ITERABLE_COROUTINE 0x0100

`

89

``

`-

#define CO_ASYNC_GENERATOR 0x0200

`

90

``

-

91

``

`-

/* bpo-39562: These constant values are changed in Python 3.9

`

92

``

`-

to prevent collision with compiler flags. CO_FUTURE_ and PyCF_

`

93

``

`-

constants must be kept unique. PyCF_ constants can use bits from

`

94

``

`-

0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */

`

95

``

`-

#define CO_FUTURE_DIVISION 0x20000

`

96

``

`-

#define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */

`

97

``

`-

#define CO_FUTURE_WITH_STATEMENT 0x80000

`

98

``

`-

#define CO_FUTURE_PRINT_FUNCTION 0x100000

`

99

``

`-

#define CO_FUTURE_UNICODE_LITERALS 0x200000

`

100

``

-

101

``

`-

#define CO_FUTURE_BARRY_AS_BDFL 0x400000

`

102

``

`-

#define CO_FUTURE_GENERATOR_STOP 0x800000

`

103

``

`-

#define CO_FUTURE_ANNOTATIONS 0x1000000

`

104

``

-

105

``

`-

/* This value is found in the co_cell2arg array when the associated cell

`

106

``

`-

variable does not correspond to an argument. */

`

107

``

`-

#define CO_CELL_NOT_AN_ARG (-1)

`

108

``

-

109

``

`-

/* This should be defined if a future statement modifies the syntax.

`

110

``

`-

For example, when a keyword is added.

`

111

``

`-

*/

`

112

``

`-

#define PY_PARSER_REQUIRES_FUTURE_KEYWORD

`

113

``

-

114

``

`-

#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */

`

115

``

-

116

``

`-

PyAPI_DATA(PyTypeObject) PyCode_Type;

`

117

``

-

118

``

`-

#define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type)

`

119

``

`-

#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars))

`

120

``

-

121

``

`-

/* Public interface */

`

122

``

`-

PyAPI_FUNC(PyCodeObject *) PyCode_New(

`

123

``

`-

int, int, int, int, int, PyObject *, PyObject *,

`

124

``

`-

PyObject *, PyObject *, PyObject *, PyObject *,

`

125

``

`-

PyObject *, PyObject *, int, PyObject *);

`

126

``

-

127

``

`-

PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs(

`

128

``

`-

int, int, int, int, int, int, PyObject *, PyObject *,

`

129

``

`-

PyObject *, PyObject *, PyObject *, PyObject *,

`

130

``

`-

PyObject *, PyObject *, int, PyObject *);

`

131

``

`-

/* same as struct above */

`

132

``

-

133

``

`-

/* Creates a new empty code object with the specified source location. */

`

134

``

`-

PyAPI_FUNC(PyCodeObject *)

`

135

``

`-

PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);

`

136

``

-

137

``

`-

/* Return the line number associated with the specified bytecode index

`

138

``

`-

in this code object. If you just need the line number of a frame,

`

139

``

`-

use PyFrame_GetLineNumber() instead. */

`

140

``

`-

PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);

`

141

``

-

142

``

`-

/* for internal use only */

`

143

``

`-

typedef struct _addr_pair {

`

144

``

`-

int ap_lower;

`

145

``

`-

int ap_upper;

`

146

``

`-

} PyAddrPair;

`

147

``

-

148

``

`-

#ifndef Py_LIMITED_API

`

149

``

`-

/* Update *bounds to describe the first and one-past-the-last instructions in the

`

150

``

`-

same line as lasti. Return the number of that line.

`

151

``

`-

*/

`

152

``

`-

PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co,

`

153

``

`-

int lasti, PyAddrPair *bounds);

`

154

``

-

155

``

`-

/* Create a comparable key used to compare constants taking in account the

`

156

``

`-

`

157

``

`-

`

158

``

`-

`

159

``

`-

`

160

``

`-

`

161

``

`-

`

162

``

`-

PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj);

`

163

``

`-

#endif

`

164

``

-

165

``

`-

PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject code, PyObject consts,

`

166

``

`-

PyObject *names, PyObject *lnotab);

`

167

``

-

``

9

`+

typedef struct PyCodeObject PyCodeObject;

`

168

10

``

169

11

`#ifndef Py_LIMITED_API

`

170

``

`-

PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index,

`

171

``

`-

void **extra);

`

172

``

`-

PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index,

`

173

``

`-

void *extra);

`

``

12

`+

define Py_CPYTHON_CODE_H

`

``

13

`+

include "cpython/code.h"

`

``

14

`+

undef Py_CPYTHON_CODE_H

`

174

15

`#endif

`

175

16

``

176

17

`#ifdef __cplusplus

`

177

18

`}

`

178

19

`#endif

`

179

20

`#endif /* !Py_CODE_H */

`

180

``

`-

#endif /* Py_LIMITED_API */

`