2021-09-13 04:04:44 +00:00
|
|
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│
|
2023-12-08 03:11:56 +00:00
|
|
|
│ vi: set et ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi │
|
2021-09-13 04:04:44 +00:00
|
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
|
|
│ Python 3 │
|
|
|
|
│ https://docs.python.org/3/license.html │
|
|
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
|
|
#include "third_party/python/Include/dictobject.h"
|
|
|
|
#include "third_party/python/Include/import.h"
|
|
|
|
#include "third_party/python/Include/pyerrors.h"
|
|
|
|
#include "third_party/python/Include/pylifecycle.h"
|
|
|
|
#include "third_party/python/Include/pystate.h"
|
|
|
|
#include "third_party/python/Include/yoink.h"
|
|
|
|
|
|
|
|
PYTHON_PROVIDE("__main__");
|
|
|
|
|
|
|
|
void
|
|
|
|
_Py_InitMain(PyInterpreterState *interp)
|
|
|
|
{
|
|
|
|
PyObject *m, *d, *loader, *ann_dict;
|
|
|
|
m = PyImport_AddModule("__main__");
|
|
|
|
if (m == NULL)
|
|
|
|
Py_FatalError("can't create __main__ module");
|
|
|
|
d = PyModule_GetDict(m);
|
|
|
|
ann_dict = PyDict_New();
|
|
|
|
if ((ann_dict == NULL) ||
|
|
|
|
(PyDict_SetItemString(d, "__annotations__", ann_dict) < 0)) {
|
|
|
|
Py_FatalError("Failed to initialize __main__.__annotations__");
|
|
|
|
}
|
|
|
|
Py_DECREF(ann_dict);
|
|
|
|
if (PyDict_GetItemString(d, "__builtins__") == NULL) {
|
|
|
|
PyObject *bimod = PyImport_ImportModule("builtins");
|
|
|
|
if (bimod == NULL) {
|
|
|
|
Py_FatalError("Failed to retrieve builtins module");
|
|
|
|
}
|
|
|
|
if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
|
|
|
|
Py_FatalError("Failed to initialize __main__.__builtins__");
|
|
|
|
}
|
|
|
|
Py_DECREF(bimod);
|
|
|
|
}
|
|
|
|
/* Main is a little special - imp.is_builtin("__main__") will return
|
|
|
|
* False, but BuiltinImporter is still the most appropriate initial
|
|
|
|
* setting for its __loader__ attribute. A more suitable value will
|
|
|
|
* be set if __main__ gets further initialized later in the startup
|
|
|
|
* process.
|
|
|
|
*/
|
|
|
|
loader = PyDict_GetItemString(d, "__loader__");
|
|
|
|
if (loader == NULL || loader == Py_None) {
|
|
|
|
PyObject *loader = PyObject_GetAttrString(interp->importlib,
|
|
|
|
"BuiltinImporter");
|
|
|
|
if (loader == NULL) {
|
|
|
|
Py_FatalError("Failed to retrieve BuiltinImporter");
|
|
|
|
}
|
|
|
|
if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
|
|
|
|
Py_FatalError("Failed to initialize __main__.__loader__");
|
|
|
|
}
|
|
|
|
Py_DECREF(loader);
|
|
|
|
}
|
|
|
|
}
|