FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Modules/_testcapi/code.c at main · faster-cpython/cpython · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
faster-cpython
/
cpython
Public
forked from
python/cpython
Notifications
You must be signed in to change notification settings
Fork
27
Star
529
Code
Pull requests
1
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Modules
/
_testcapi
/
code.c
Copy path
More file actions
More file actions
Latest commit
History
History
History
117 lines (104 loc) · 3.13 KB
Breadcrumbs
cpython
/
Modules
/
_testcapi
/
code.c
Copy path
File metadata and controls
117 lines (104 loc) · 3.13 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include
"parts.h"
#include
"util.h"
static
Py_ssize_t
get_code_extra_index
(
PyInterpreterState
*
interp
) {
Py_ssize_t
result
=
-1
;
static
const
char
*
key
=
"_testcapi.frame_evaluation.code_index"
;
PyObject
*
interp_dict
=
PyInterpreterState_GetDict
(
interp
);
// borrowed
assert
(
interp_dict
);
// real users would handle missing dict... somehow
PyObject
*
index_obj
;
if
(
PyDict_GetItemStringRef
(
interp_dict
,
key
,
&
index_obj
)
<
0
) {
goto
finally
;
}
Py_ssize_t
index
=
0
;
if
(!
index_obj
) {
index
=
PyUnstable_Eval_RequestCodeExtraIndex
(
NULL
);
if
(
index
<
0
||
PyErr_Occurred
()) {
goto
finally
;
}
index_obj
=
PyLong_FromSsize_t
(
index
);
// strong ref
if
(!
index_obj
) {
goto
finally
;
}
int
res
=
PyDict_SetItemString
(
interp_dict
,
key
,
index_obj
);
Py_DECREF
(
index_obj
);
if
(
res
<
0
) {
goto
finally
;
}
}
else
{
index
=
PyLong_AsSsize_t
(
index_obj
);
Py_DECREF
(
index_obj
);
if
(
index
==
-1
&&
PyErr_Occurred
()) {
goto
finally
;
}
}
result
=
index
;
finally
:
return
result
;
}
static
PyObject
*
test_code_extra
(
PyObject
*
self
,
PyObject
*
Py_UNUSED
(
callable
))
{
PyObject
*
result
=
NULL
;
PyObject
*
test_func
=
NULL
;
// Get or initialize interpreter-specific code object storage index
PyInterpreterState
*
interp
=
PyInterpreterState_Get
();
if
(!
interp
) {
return
NULL
;
}
Py_ssize_t
code_extra_index
=
get_code_extra_index
(
interp
);
if
(
PyErr_Occurred
()) {
goto
finally
;
}
// Get a function to test with
// This can be any Python function. Use `test.test_misc.testfunction`.
test_func
=
PyImport_ImportModuleAttrString
(
"test.test_capi.test_misc"
,
"testfunction"
);
if
(!
test_func
) {
goto
finally
;
}
PyObject
*
test_func_code
=
PyFunction_GetCode
(
test_func
);
// borrowed
if
(!
test_func_code
) {
goto
finally
;
}
// Check the value is initially NULL
void
*
extra
=
UNINITIALIZED_PTR
;
int
res
=
PyUnstable_Code_GetExtra
(
test_func_code
,
code_extra_index
,
&
extra
);
if
(
res
<
0
) {
goto
finally
;
}
assert
(
extra
==
NULL
);
// Set another code extra value
res
=
PyUnstable_Code_SetExtra
(
test_func_code
,
code_extra_index
, (
void
*
)(
uintptr_t
)
77
);
if
(
res
<
0
) {
goto
finally
;
}
// Assert it was set correctly
extra
=
UNINITIALIZED_PTR
;
res
=
PyUnstable_Code_GetExtra
(
test_func_code
,
code_extra_index
,
&
extra
);
if
(
res
<
0
) {
goto
finally
;
}
assert
((
uintptr_t
)
extra
==
77
);
// Revert to initial code extra value.
res
=
PyUnstable_Code_SetExtra
(
test_func_code
,
code_extra_index
,
NULL
);
if
(
res
<
0
) {
goto
finally
;
}
result
=
Py_NewRef
(
Py_None
);
finally
:
Py_XDECREF
(
test_func
);
return
result
;
}
static
PyMethodDef
TestMethods
[]
=
{
{
"test_code_extra"
,
test_code_extra
,
METH_NOARGS
},
{
NULL
},
};
int
_PyTestCapi_Init_Code
(
PyObject
*
m
) {
if
(
PyModule_AddFunctions
(
m
,
TestMethods
)
<
0
) {
return
-1
;
}
return
0
;
}
Back
|
FazBrowse Home
|
New Git URL