##// END OF EJS Templates
dirstate: Remove the Rust abstraction DirstateMapMethods...
dirstate: Remove the Rust abstraction DirstateMapMethods This Rust trait used to exist in order to allow the DirstateMap class exposed to Python to be backed by either of two implementations: one similar to the Python implementation based on a "flat" `HashMap<HgPathBuf, DirstateEntry>`, and the newer one based on a tree of nodes matching the directory structure of tracked files. A boxed trait object was used with dynamic dispatch. With the flat implementation removed and only the tree one remaining, this abstraction is not useful anymore and the concrete type can be stored directly. It remains that the trait was implemented separately for `DirstateMap<'_>` (which takes a lifetime parameter) and `OwningDirstateMap` (whose job is to wrap the former and hide the lifetime parameter), with the latter impl only forwarding calls. This changeset also removes this forwarding. Instead, the methods formerly of the `DirstateMapMethods` trait are now inherent methods implemented for `OwningDirstateMap` (where they will actually be used) but in the module that defines `DirstateMap`. This unusual setup gives access to the private fields of `DirstateMap` from those methods. Differential Revision: https://phab.mercurial-scm.org/D11517

File last commit:

r45488:ee5f27d7 default
r48883:3d0a9c6e default
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