FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Python/importdl.c at 9587286f98676f7723b0f8e2da17422f8ca84bf9 · python/cpython · GitHub
python
cpython
Repository navigation
Code
Issues
5k+
(5k+)
Pull requests
2.3k
(2.3k)
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Python
/
importdl.c
Copy path
More file actions
More file actions
Latest commit
History
History
History
113 lines (96 loc) · 2.93 KB
Breadcrumbs
cpython
/
Python
/
importdl.c
Copy path
File metadata and controls
113 lines (96 loc) · 2.93 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
/* Support for dynamic loading of extension modules */
#include
"Python.h"
/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
supported on this platform. configure will then compile and link in one
of the dynload_*.c files, as appropriate. We will call a function in
those modules to get a function pointer to the module's init function.
*/
#ifdef
HAVE_DYNAMIC_LOADING
#include
"importdl.h"
extern
dl_funcptr
_PyImport_GetDynLoadFunc
(
const
char
*
shortname
,
const
char
*
pathname
,
FILE
*
fp
);
PyObject
*
_PyImport_LoadDynamicModule
(
char
*
name
,
char
*
pathname
,
FILE
*
fp
)
{
PyObject
*
m
;
PyObject
*
path
;
char
*
lastdot
,
*
shortname
,
*
packagecontext
,
*
oldcontext
;
dl_funcptr
p0
;
PyObject
*
(
*
p
)(
void
);
struct
PyModuleDef
*
def
;
PyObject
*
nameobj
,
*
result
;
path
=
PyUnicode_DecodeFSDefault
(
pathname
);
if
(
path
==
NULL
)
return
NULL
;
nameobj
=
PyUnicode_FromString
(
name
);
if
(
nameobj
==
NULL
)
return
NULL
;
m
=
_PyImport_FindExtensionObject
(
nameobj
,
path
);
if
(
m
!=
NULL
) {
Py_DECREF
(
nameobj
);
Py_INCREF
(
m
);
result
=
m
;
goto
finally
;
}
Py_DECREF
(
nameobj
);
lastdot
=
strrchr
(
name
,
'.'
);
if
(
lastdot
==
NULL
) {
packagecontext
=
NULL
;
shortname
=
name
;
}
else
{
packagecontext
=
name
;
shortname
=
lastdot
+
1
;
}
p0
=
_PyImport_GetDynLoadFunc
(
shortname
,
pathname
,
fp
);
p
=
(
PyObject
*
(
*
)(
void
))
p0
;
if
(
PyErr_Occurred
())
goto
error
;
if
(
p
==
NULL
) {
PyErr_Format
(
PyExc_ImportError
,
"dynamic module does not define init function (PyInit_%.200s)"
,
shortname
);
goto
error
;
}
oldcontext
=
_Py_PackageContext
;
_Py_PackageContext
=
packagecontext
;
m
=
(
*
p
)();
_Py_PackageContext
=
oldcontext
;
if
(
m
==
NULL
)
goto
error
;
if
(
PyErr_Occurred
()) {
Py_DECREF
(
m
);
PyErr_Format
(
PyExc_SystemError
,
"initialization of %s raised unreported exception"
,
shortname
);
goto
error
;
}
/* Remember pointer to module init function. */
def
=
PyModule_GetDef
(
m
);
def
->
m_base
.
m_init
=
p
;
/* Remember the filename as the __file__ attribute */
if
(
PyModule_AddObject
(
m
,
"__file__"
,
path
)
<
0
)
PyErr_Clear
();
/* Not important enough to report */
else
Py_INCREF
(
path
);
nameobj
=
PyUnicode_FromString
(
name
);
if
(
nameobj
==
NULL
)
return
NULL
;
if
(
_PyImport_FixupExtensionObject
(
m
,
nameobj
,
path
)
<
0
) {
Py_DECREF
(
nameobj
);
goto
error
;
}
if
(
Py_VerboseFlag
)
PySys_FormatStderr
(
"import %U # dynamically loaded from %s\n"
,
nameobj
,
pathname
);
Py_DECREF
(
nameobj
);
result
=
m
;
goto
finally
;
error
:
result
=
NULL
;
finally
:
Py_DECREF
(
path
);
return
result
;
}
#endif
/* HAVE_DYNAMIC_LOADING */
Back
|
FazBrowse Home
|
New Git URL