aboutsummaryrefslogtreecommitdiffstats
path: root/library/python/runtime_py3/sitecustomize.cpp
blob: be68ad39780045c26d398fecfe3f53142a5ad5de (plain) (blame)
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
#include <Python.h>
#include <marshal.h>

#include <iterator>

namespace {

const unsigned char sitecustomize_pyc[] = {
    #include "sitecustomize.pyc.inc"
};

int modsitecustomize_exec(PyObject *mod) noexcept {
    PyObject *bytecode = PyMarshal_ReadObjectFromString(
        reinterpret_cast<const char*>(sitecustomize_pyc),
        std::size(sitecustomize_pyc)
    );
    if (!bytecode) {
        return -1;
    }
    PyObject* modns = PyModule_GetDict(mod);
    if (!modns) {
        return -1;
    }
    if (PyObject* evalRes = PyEval_EvalCode(bytecode, modns, modns)) {
        Py_DECREF(evalRes);
    }
    if (PyErr_Occurred()) {
        return -1;
    }
    return 0;
}

PyDoc_STRVAR(modsitecustomize_doc,
"bridge between Arcadia resource system and python importlib resources interface.");

PyMethodDef modsitecustomize_methods[] = {
    {nullptr, nullptr, 0, nullptr}
};

PyModuleDef_Slot modsitecustomize_slots[] = {
    {Py_mod_exec, reinterpret_cast<void*>(&modsitecustomize_exec)},
    {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
    {0, nullptr},
};

PyModuleDef modsitecustomize = {
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "sitecustomize",
    .m_doc = modsitecustomize_doc,
    .m_size = 0,
    .m_methods = modsitecustomize_methods,
    .m_slots = modsitecustomize_slots,
    .m_traverse = nullptr,
    .m_clear = nullptr,
    .m_free = nullptr
};

}

PyMODINIT_FUNC
PyInit_sitecustomize() noexcept {
    return PyModuleDef_Init(&modsitecustomize);
}