##// END OF EJS Templates
tests: migrate the pytype test to a shell script for easier CI processing...
tests: migrate the pytype test to a shell script for easier CI processing There have been recent hangs and timeout, but it's hard to debug because the *.t test redirects output to a file and only prints it if `pytype` actually exits. This shell script can be run directly by CI, and will allow more flexibility to try to cache and restore type stubs for further speed increases.

File last commit:

r45488:ee5f27d7 default
r50396:08c3ecd8 stable
Show More
pyutil.cc
76 lines | 1.7 KiB | text/x-c | CppLexer
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include "pyutil.h"
Augie Fackler
fuzz: fix an unused result on getcwd() in pyutil...
r44259 #include <iostream>
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include <string>
namespace contrib
{
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #if PY_MAJOR_VERSION >= 3
#define HG_FUZZER_PY3 1
PyMODINIT_FUNC PyInit_parsers(void);
#else
PyMODINIT_FUNC initparsers(void);
#endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 static char cpypath[8192] = "\0";
static PyObject *mainmod;
static PyObject *globals;
void initpy(const char *cselfpath)
{
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #ifdef HG_FUZZER_PY3
Augie Fackler
pyutil: this has taken so long to fix, I'm using 3.8 now...
r45488 const std::string subdir = "/sanpy/lib/python3.8";
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 const std::string subdir = "/sanpy/lib/python2.7";
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 /* HACK ALERT: we need a full Python installation built without
pymalloc and with ASAN, so we dump one in
$OUT/sanpy/lib/python2.7. This helps us wire that up. */
std::string selfpath(cselfpath);
std::string pypath;
auto pos = selfpath.rfind("/");
if (pos == std::string::npos) {
char wd[8192];
Augie Fackler
fuzz: fix an unused result on getcwd() in pyutil...
r44259 if (!getcwd(wd, 8192)) {
std::cerr << "Failed to call getcwd: errno " << errno
<< std::endl;
exit(1);
}
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 pypath = std::string(wd) + subdir;
} else {
pypath = selfpath.substr(0, pos) + subdir;
}
strncpy(cpypath, pypath.c_str(), pypath.size());
setenv("PYTHONPATH", cpypath, 1);
setenv("PYTHONNOUSERSITE", "1", 1);
/* prevent Python from looking up users in the fuzz environment */
setenv("PYTHONUSERBASE", cpypath, 1);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #ifdef HG_FUZZER_PY3
std::wstring wcpypath(pypath.begin(), pypath.end());
Py_SetPythonHome(wcpypath.c_str());
#else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 Py_SetPythonHome(cpypath);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 #endif
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 Py_InitializeEx(0);
mainmod = PyImport_AddModule("__main__");
globals = PyModule_GetDict(mainmod);
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311
#ifdef HG_FUZZER_PY3
PyObject *mod = PyInit_parsers();
#else
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 initparsers();
Augie Fackler
fuzz: add support for fuzzing under either Python 2 or 3...
r44311 PyObject *mod = PyImport_ImportModule("parsers");
#endif
PyDict_SetItemString(globals, "parsers", mod);
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 }
PyObject *pyglobals()
{
return globals;
}
} // namespace contrib