Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1e420f8

Browse files
authored
bpo-35134: Migrate frameobject.h contents to cpython/frameobject.h (GH-18052)
1 parent 5492bfc commit 1e420f8

File tree

2 files changed

+95
-74
lines changed

2 files changed

+95
-74
lines changed

Include/cpython/frameobject.h

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/* Frame object interface */
2+
3+
#ifndef Py_CPYTHON_FRAMEOBJECT_H
4+
# error "this header file must not be included directly"
5+
#endif
6+
7+
#ifdef __cplusplus
8+
extern "C" {
9+
#endif
10+
11+
typedef struct {
12+
int b_type; /* what kind of block this is */
13+
int b_handler; /* where to jump to find handler */
14+
int b_level; /* value stack level to pop to */
15+
} PyTryBlock;
16+
17+
typedef struct _frame {
18+
PyObject_VAR_HEAD
19+
struct _frame *f_back; /* previous frame, or NULL */
20+
PyCodeObject *f_code; /* code segment */
21+
PyObject *f_builtins; /* builtin symbol table (PyDictObject) */
22+
PyObject *f_globals; /* global symbol table (PyDictObject) */
23+
PyObject *f_locals; /* local symbol table (any mapping) */
24+
PyObject **f_valuestack; /* points after the last local */
25+
/* Next free slot in f_valuestack. Frame creation sets to f_valuestack.
26+
Frame evaluation usually NULLs it, but a frame that yields sets it
27+
to the current stack top. */
28+
PyObject **f_stacktop;
29+
PyObject *f_trace; /* Trace function */
30+
char f_trace_lines; /* Emit per-line trace events? */
31+
char f_trace_opcodes; /* Emit per-opcode trace events? */
32+
33+
/* Borrowed reference to a generator, or NULL */
34+
PyObject *f_gen;
35+
36+
int f_lasti; /* Last instruction if called */
37+
/* Call PyFrame_GetLineNumber() instead of reading this field
38+
directly. As of 2.3 f_lineno is only valid when tracing is
39+
active (i.e. when f_trace is set). At other times we use
40+
PyCode_Addr2Line to calculate the line from the current
41+
bytecode index. */
42+
int f_lineno; /* Current line number */
43+
int f_iblock; /* index in f_blockstack */
44+
char f_executing; /* whether the frame is still executing */
45+
PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
46+
PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
47+
} PyFrameObject;
48+
49+
50+
/* Standard object interface */
51+
52+
PyAPI_DATA(PyTypeObject) PyFrame_Type;
53+
54+
#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type)
55+
56+
PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *,
57+
PyObject *, PyObject *);
58+
59+
/* only internal use */
60+
PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *,
61+
PyObject *, PyObject *);
62+
63+
64+
/* The rest of the interface is specific for frame objects */
65+
66+
/* Block management functions */
67+
68+
PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int);
69+
PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *);
70+
71+
/* Conversions between "fast locals" and locals in dictionary */
72+
73+
PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int);
74+
75+
PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f);
76+
PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *);
77+
78+
PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
79+
80+
PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out);
81+
82+
/* Return the line of code the frame is currently executing. */
83+
PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
84+
85+
#ifdef __cplusplus
86+
}
87+
#endif

Include/frameobject.h

Lines changed: 8 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,22 @@
11
/* Frame object interface */
22

3-
#ifndef Py_LIMITED_API
43
#ifndef Py_FRAMEOBJECT_H
54
#define Py_FRAMEOBJECT_H
65
#ifdef __cplusplus
76
extern "C" {
87
#endif
98

10-
typedef struct {
11-
int b_type; /* what kind of block this is */
12-
int b_handler; /* where to jump to find handler */
13-
int b_level; /* value stack level to pop to */
14-
} PyTryBlock;
15-
16-
typedef struct _frame {
17-
PyObject_VAR_HEAD
18-
struct _frame *f_back; /* previous frame, or NULL */
19-
PyCodeObject *f_code; /* code segment */
20-
PyObject *f_builtins; /* builtin symbol table (PyDictObject) */
21-
PyObject *f_globals; /* global symbol table (PyDictObject) */
22-
PyObject *f_locals; /* local symbol table (any mapping) */
23-
PyObject **f_valuestack; /* points after the last local */
24-
/* Next free slot in f_valuestack. Frame creation sets to f_valuestack.
25-
Frame evaluation usually NULLs it, but a frame that yields sets it
26-
to the current stack top. */
27-
PyObject **f_stacktop;
28-
PyObject *f_trace; /* Trace function */
29-
char f_trace_lines; /* Emit per-line trace events? */
30-
char f_trace_opcodes; /* Emit per-opcode trace events? */
31-
32-
/* Borrowed reference to a generator, or NULL */
33-
PyObject *f_gen;
34-
35-
int f_lasti; /* Last instruction if called */
36-
/* Call PyFrame_GetLineNumber() instead of reading this field
37-
directly. As of 2.3 f_lineno is only valid when tracing is
38-
active (i.e. when f_trace is set). At other times we use
39-
PyCode_Addr2Line to calculate the line from the current
40-
bytecode index. */
41-
int f_lineno; /* Current line number */
42-
int f_iblock; /* index in f_blockstack */
43-
char f_executing; /* whether the frame is still executing */
44-
PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
45-
PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
46-
} PyFrameObject;
47-
48-
49-
/* Standard object interface */
50-
51-
PyAPI_DATA(PyTypeObject) PyFrame_Type;
52-
53-
#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type)
54-
55-
PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *,
56-
PyObject *, PyObject *);
57-
58-
/* only internal use */
59-
PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *,
60-
PyObject *, PyObject *);
61-
9+
/* There are currently no frame related APIs in the stable ABI
10+
* (they're all in the full CPython-specific API)
11+
*/
6212

63-
/* The rest of the interface is specific for frame objects */
64-
65-
/* Block management functions */
66-
67-
PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int);
68-
PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *);
69-
70-
/* Conversions between "fast locals" and locals in dictionary */
71-
72-
PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int);
73-
74-
PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f);
75-
PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *);
76-
77-
PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
78-
79-
PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out);
80-
81-
/* Return the line of code the frame is currently executing. */
82-
PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
13+
#ifndef Py_LIMITED_API
14+
# define Py_CPYTHON_FRAMEOBJECT_H
15+
# include "cpython/frameobject.h"
16+
# undef Py_CPYTHON_FRAMEOBJECT_H
17+
#endif
8318

8419
#ifdef __cplusplus
8520
}
8621
#endif
8722
#endif /* !Py_FRAMEOBJECT_H */
88-
#endif /* Py_LIMITED_API */

0 commit comments

Comments
 (0)