/branch/0.3.x/pykd_ext/pyinterpret.cpp
C++ | 856 lines | 664 code | 184 blank | 8 comment | 56 complexity | 320bae7caac31051ca7799d66a7b5ea1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Unlicense
1#include "stdafx.h"
2#include "pyinterpret.h"
3
4#include <memory>
5#include <sstream>
6#include <map>
7#include <set>
8#include <algorithm>
9
10#include "pymodule.h"
11#include "pyclass.h"
12#include "dbgout.h"
13
14class PyModule;
15class PythonInterpreter;
16
17class HKey
18{
19
20public:
21
22 HKey() : m_key(NULL)
23 {}
24
25 ~HKey()
26 {
27 if (m_key)
28 RegCloseKey(m_key);
29 }
30
31 operator HKEY*()
32 {
33 return &m_key;
34 }
35
36 operator HKEY() const
37 {
38 return m_key;
39 }
40
41private:
42
43 HKEY m_key;
44};
45
46
47class PyModule
48{
49public:
50
51 PyModule(int majorVesion, int minorVersion);
52
53 ~PyModule();
54
55 bool isPy3;
56
57 void checkPykd();
58 void deactivate();
59
60 PyObject* PyType_Type;
61 PyObject* PyProperty_Type;
62 PyObject* Py_None;
63 PyObject* PyExc_SystemExit;
64
65 void( *Py_Initialize)();
66 void( *Py_Finalize)();
67
68 PyThreadState* ( *Py_NewInterpreter)();
69 void( *Py_EndInterpreter)(PyThreadState *tstate);
70 PyObject* ( *PyEval_GetGlobals)();
71 PyObject* ( *PyImport_Import)(PyObject *name);
72 PyObject* ( *PyImport_ImportModule)(const char *name);
73 void( *PyEval_InitThreads)();
74 PyThreadState* ( *PyEval_SaveThread)();
75 void( *PyEval_RestoreThread)(PyThreadState *tstate);
76 PyThreadState* ( *PyThreadState_Swap)(PyThreadState *tstate);
77 PyObject* ( *PyRun_String)(const char *str, int start, PyObject *globals, PyObject *locals);
78 int( *PyRun_SimpleString)(const char* str);
79 PyObject* ( *PyRun_File)(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals);
80 PyObject* ( *PyDict_New)();
81 int( *PyDict_SetItemString)(PyObject *p, const char *key, PyObject *val);
82 PyObject*( *PyDict_GetItemString)(PyObject *p, const char* key);
83 void( *Py_IncRef)(PyObject* object);
84 void( *Py_DecRef)(PyObject* object);
85 PyObject* ( *PyObject_Call)(PyObject *callable_object, PyObject *args, PyObject *kw);
86 PyObject* ( *PyObject_GetAttr)(PyObject *object, PyObject *attr_name);
87 PyObject* ( *PyObject_GetAttrString)(PyObject *object, const char *attr_name);
88 int( *PyObject_SetAttr)(PyObject *object, PyObject *attr_name, PyObject *value);
89 PyObject* ( *PyObject_CallObject)(PyObject *callable_object, PyObject *args);
90 PyObject* ( *PyTuple_New)(size_t len);
91 int( *PyTuple_SetItem)(PyObject *p, size_t pos, PyObject *o);
92 PyObject* ( *PyTuple_GetItem)(PyObject *p, size_t pos);
93 size_t( *PyTuple_Size)(PyObject *p);
94 PyObject* ( *PyCFunction_NewEx)(PyMethodDef *, PyObject *, PyObject *);
95 PyObject* ( *PySys_GetObject)(char *name);
96 int( *PySys_SetObject)(char *name, PyObject *v);
97 void( *PySys_SetArgv)(int argc, char **argv);
98 void( *PySys_SetArgv_Py3)(int argc, wchar_t **argv);
99 PyObject* ( *PyString_FromString)(const char *v);
100 char* ( *PyString_AsString)(PyObject *string);
101 void( *PyErr_Fetch)(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback);
102 void( *PyErr_NormalizeException)(PyObject**exc, PyObject**val, PyObject**tb);
103 void( *PyErr_SetString)(PyObject *type, const char *message);
104 void( *PyErr_Clear)();
105 PyObject* ( *PyImport_AddModule)(const char *name);
106 PyObject* ( *PyClass_New)(PyObject* className, PyObject* classBases, PyObject* classDict);
107 PyObject* ( *PyInstance_New)(PyObject *classobj, PyObject *arg, PyObject *kw);
108 PyObject* ( *PyMethod_New)(PyObject *func, PyObject *self, PyObject *classobj);
109 PyObject* ( *PyCapsule_New)(void *pointer, const char *name, PyCapsule_Destructor destructor);
110 void* ( *PyCapsule_GetPointer)(PyObject *capsule, const char *name);
111 int( *PyObject_SetAttrString)(PyObject *o, const char *attr_name, PyObject *v);
112 PyObject* ( *PyUnicode_FromWideChar)(const wchar_t *w, size_t size);
113 PyObject* ( *PyBool_FromLong)(long v);
114 size_t( *PyList_Size)(PyObject* list);
115 PyObject* ( *PyList_GetItem)(PyObject *list, size_t index);
116 PyObject* ( *PyFile_FromString)(char *filename, char *mode);
117 FILE* ( *PyFile_AsFile)(PyObject *pyfile);
118 PyObject* ( *PyUnicode_FromString)(const char *u);
119 PyObject* ( *PyInstanceMethod_New)(PyObject *func);
120 size_t( *PyUnicode_AsWideChar)(PyObject *unicode, wchar_t *w, size_t size);
121 FILE* ( *_Py_fopen)(const char* filename, const char* mode);
122 int( *Py_AddPendingCall)(int(*func)(void *), void *arg);
123 PyGILState_STATE( *PyGILState_Ensure)();
124 void( *PyGILState_Release)(PyGILState_STATE state);
125 PyObject* ( *PyDescr_NewMethod)(PyObject* type, struct PyMethodDef *meth);
126
127 HMODULE m_handlePython;
128 PyThreadState* m_globalState;
129 PythonInterpreter* m_globalInterpreter;
130 bool m_pykdInit;
131};
132
133
134
135class PythonInterpreter
136{
137public:
138
139 PythonInterpreter(PyModule* mod) :
140 m_module(mod)
141 {
142 PyThreadState* state = mod->Py_NewInterpreter();
143
144 m_module->PyThreadState_Swap(state);
145
146 m_state = m_module->PyEval_SaveThread();
147 }
148
149 ~PythonInterpreter()
150 {
151 m_module->PyEval_RestoreThread(m_state);
152
153 m_module->Py_EndInterpreter(m_state);
154 }
155
156 PyModule* m_module;
157
158 PyThreadState* m_state;
159};
160
161
162class PythonSingleton
163{
164public:
165
166
167 static PythonSingleton* get()
168 {
169 if (m_singleton.get() == 0)
170 m_singleton.reset(new PythonSingleton());
171 return m_singleton.get();
172 }
173
174
175 PythonInterpreter* currentInterpreter()
176 {
177 return m_currentInterpter;
178 }
179
180 PythonInterpreter* getInterpreter(int majorVersion, int minorVersion, bool global)
181 {
182 PyModule* module = 0;
183
184 if (m_modules.find(std::make_pair(majorVersion, minorVersion)) == m_modules.end())
185 {
186 module = new PyModule(majorVersion, minorVersion);
187 m_modules.insert(std::make_pair(std::make_pair(majorVersion, minorVersion), module));
188 }
189 else
190 {
191 module = m_modules[std::make_pair(majorVersion, minorVersion)];
192 }
193
194 if (global)
195 {
196 if (module->m_globalInterpreter == 0)
197 {
198 module->PyEval_RestoreThread(module->m_globalState);
199 module->m_globalInterpreter = new PythonInterpreter(module);
200 }
201
202 m_currentInterpter = module->m_globalInterpreter;
203 m_currentIsGlobal = true;
204 }
205 else
206 {
207 module->PyEval_RestoreThread(module->m_globalState);
208 m_currentInterpter = new PythonInterpreter(module);
209 m_currentIsGlobal = false;
210 }
211
212 m_currentInterpter->m_module->PyEval_RestoreThread(m_currentInterpter->m_state);
213
214 return m_currentInterpter;
215 }
216
217 void releaseInterpretor(PythonInterpreter* interpret)
218 {
219 PyModule* module = m_currentInterpter->m_module;
220
221 m_currentInterpter->m_state = module->PyEval_SaveThread();
222
223 if (!m_currentIsGlobal)
224 {
225 delete m_currentInterpter;
226
227 module->PyThreadState_Swap(module->m_globalState);
228 module->m_globalState = module->PyEval_SaveThread();
229 }
230
231 m_currentInterpter = 0;
232 }
233
234 bool isInterpreterLoaded(int majorVersion, int minorVersion)
235 {
236 return m_modules.find(std::make_pair(majorVersion, minorVersion)) != m_modules.end();
237 }
238
239 void checkPykd()
240 {
241 m_currentInterpter->m_module->checkPykd();
242 }
243
244 void stopAllInterpreter()
245 {
246 for (auto m : m_modules)
247 {
248 m_currentInterpter = m.second->m_globalInterpreter;
249 m.second->deactivate();
250 }
251 m_currentInterpter = 0;
252 }
253
254private:
255
256 static std::auto_ptr<PythonSingleton> m_singleton;
257
258 std::map<std::pair<int,int>, PyModule*> m_modules;
259
260 PythonInterpreter* m_currentInterpter;
261 bool m_currentIsGlobal;
262};
263
264std::auto_ptr<PythonSingleton> PythonSingleton::m_singleton;
265
266HMODULE LoadPythonForKey(HKEY installPathKey, int majorVersion, int minorVersion)
267{
268
269 HMODULE hmodule = NULL;
270
271 char installPath[1000];
272 DWORD installPathSize = sizeof(installPath);
273
274 if (ERROR_SUCCESS == RegQueryValueExA(installPathKey, NULL, NULL, NULL, (LPBYTE)installPath, &installPathSize))
275 {
276 std::stringstream dllName;
277 dllName << "python" << majorVersion << minorVersion << ".dll";
278
279 std::stringstream imagePath;
280 imagePath << installPath << dllName.str();
281
282 hmodule = LoadLibraryExA(imagePath.str().c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
283 if (hmodule)
284 return hmodule;
285
286 hmodule = LoadLibraryA(dllName.str().c_str());
287 if (hmodule)
288 return hmodule;
289
290 }
291
292 return NULL;
293}
294
295
296HMODULE LoadPythonLibrary(int majorVersion, int minorVersion)
297{
298
299 HKey pythonCoreKey;
300
301 for (auto rootKey : std::list<HKEY>({ HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }))
302 {
303 if (ERROR_SUCCESS == RegOpenKeyA(rootKey, "SOFTWARE\\Python\\PythonCore", pythonCoreKey))
304 {
305 HKey installPathKey;
306
307 std::stringstream installPathStr;
308
309 if (majorVersion == 2 || (majorVersion == 3 && minorVersion <= 4))
310 {
311 installPathStr << majorVersion << '.' << minorVersion << "\\InstallPath";
312 }
313 else
314 if (majorVersion == 3 && minorVersion >= 5)
315 {
316#ifdef _M_X64
317 installPathStr << majorVersion << '.' << minorVersion << "\\InstallPath";
318#else
319 installPathStr << majorVersion << '.' << minorVersion << "-32" << "\\InstallPath";
320#endif
321 }
322
323 if (ERROR_SUCCESS == RegOpenKeyA(pythonCoreKey, installPathStr.str().c_str(), installPathKey))
324 {
325 HMODULE hmodule = LoadPythonForKey(installPathKey, majorVersion, minorVersion);
326 if (hmodule)
327 return hmodule;
328 }
329 }
330 }
331
332 return NULL;
333}
334
335
336std::list<InterpreterDesc> getInstalledInterpreter()
337{
338 std::set<InterpreterDesc> interpretSet;
339
340 for (auto rootKey : const std::list<HKEY>({ HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }))
341 {
342 HKey pythonCoreKey;
343
344 if (ERROR_SUCCESS != RegOpenKeyA(rootKey, "SOFTWARE\\Python\\PythonCore", pythonCoreKey))
345 continue;
346
347 for (DWORD i = 0;; ++i)
348 {
349 char versionStr[20];
350 if (ERROR_SUCCESS != RegEnumKeyA(pythonCoreKey, i, versionStr, sizeof(versionStr)))
351 break;
352
353 int majorVersion = -1, minorVersion = -1;
354 sscanf_s(versionStr, "%d.%d", &majorVersion, &minorVersion);
355
356 HKey installPathKey;
357 std::string installPathStr(versionStr);
358 installPathStr += "\\InstallPath";
359
360 if (ERROR_SUCCESS != RegOpenKeyA(pythonCoreKey, installPathStr.c_str(), installPathKey))
361 continue;
362
363 HMODULE hmodule = LoadPythonForKey(installPathKey, majorVersion, minorVersion);
364
365 if (hmodule)
366 {
367 char fullPath[1000];
368
369 if (GetModuleFileNameA(hmodule, fullPath, sizeof(fullPath)))
370 {
371 interpretSet.insert({ majorVersion, minorVersion, fullPath });
372 }
373
374 FreeLibrary(hmodule);
375 }
376 }
377 }
378
379 std::list<InterpreterDesc> interpretLst;
380
381 std::copy(interpretSet.begin(), interpretSet.end(), std::inserter(interpretLst, interpretLst.begin()));
382
383 interpretLst.sort();
384
385 return interpretLst;
386}
387
388PyModule::PyModule(int majorVesion, int minorVersion)
389{
390 m_handlePython = LoadPythonLibrary(majorVesion, minorVersion);
391
392 if (!m_handlePython)
393 throw std::exception("failed to load python module");
394
395 isPy3 = majorVesion == 3;
396
397 *reinterpret_cast<FARPROC*>(&PyType_Type) = GetProcAddress(m_handlePython, "PyType_Type");
398 *reinterpret_cast<FARPROC*>(&PyProperty_Type) = GetProcAddress(m_handlePython, "PyProperty_Type");
399 *reinterpret_cast<FARPROC*>(&Py_None) = GetProcAddress(m_handlePython, "_Py_NoneStruct");
400 PyExc_SystemExit = *reinterpret_cast<PyObject**>(GetProcAddress(m_handlePython, "PyExc_SystemExit"));
401
402 *reinterpret_cast<FARPROC*>(&Py_Initialize) = GetProcAddress(m_handlePython, "Py_Initialize");
403 *reinterpret_cast<FARPROC*>(&Py_Finalize) = GetProcAddress(m_handlePython, "Py_Finalize");
404 *reinterpret_cast<FARPROC*>(&Py_NewInterpreter) = GetProcAddress(m_handlePython, "Py_NewInterpreter");
405 *reinterpret_cast<FARPROC*>(&Py_EndInterpreter) = GetProcAddress(m_handlePython, "Py_EndInterpreter");
406 *reinterpret_cast<FARPROC*>(&Py_DecRef) = GetProcAddress(m_handlePython, "Py_DecRef");
407 *reinterpret_cast<FARPROC*>(&Py_IncRef) = GetProcAddress(m_handlePython, "Py_IncRef");
408 *reinterpret_cast<FARPROC*>(&PyEval_GetGlobals) = GetProcAddress(m_handlePython, "PyEval_GetGlobals");
409 *reinterpret_cast<FARPROC*>(&PyEval_InitThreads) = GetProcAddress(m_handlePython, "PyEval_InitThreads");
410 *reinterpret_cast<FARPROC*>(&PyEval_SaveThread) = GetProcAddress(m_handlePython, "PyEval_SaveThread");
411 *reinterpret_cast<FARPROC*>(&PyEval_RestoreThread) = GetProcAddress(m_handlePython, "PyEval_RestoreThread");
412 *reinterpret_cast<FARPROC*>(&PyThreadState_Swap) = GetProcAddress(m_handlePython, "PyThreadState_Swap");
413 *reinterpret_cast<FARPROC*>(&PyRun_String) = GetProcAddress(m_handlePython, "PyRun_String");
414 *reinterpret_cast<FARPROC*>(&PyRun_SimpleString) = GetProcAddress(m_handlePython, "PyRun_SimpleString");
415 *reinterpret_cast<FARPROC*>(&PyRun_File) = GetProcAddress(m_handlePython, "PyRun_File");
416 *reinterpret_cast<FARPROC*>(&PyDict_New) = GetProcAddress(m_handlePython, "PyDict_New");
417 *reinterpret_cast<FARPROC*>(&PyDict_SetItemString) = GetProcAddress(m_handlePython, "PyDict_SetItemString");
418 *reinterpret_cast<FARPROC*>(&PyDict_GetItemString) = GetProcAddress(m_handlePython, "PyDict_GetItemString");
419 *reinterpret_cast<FARPROC*>(&PyObject_Call) = GetProcAddress(m_handlePython, "PyObject_Call");
420 *reinterpret_cast<FARPROC*>(&PyObject_GetAttr) = GetProcAddress(m_handlePython, "PyObject_GetAttr");
421 *reinterpret_cast<FARPROC*>(&PyObject_GetAttrString) = GetProcAddress(m_handlePython, "PyObject_GetAttrString");
422 *reinterpret_cast<FARPROC*>(&PyObject_SetAttr) = GetProcAddress(m_handlePython, "PyObject_SetAttr");
423 *reinterpret_cast<FARPROC*>(&PyObject_CallObject) = GetProcAddress(m_handlePython, "PyObject_CallObject");
424 *reinterpret_cast<FARPROC*>(&PyTuple_New) = GetProcAddress(m_handlePython, "PyTuple_New");
425 *reinterpret_cast<FARPROC*>(&PyTuple_SetItem) = GetProcAddress(m_handlePython, "PyTuple_SetItem");
426 *reinterpret_cast<FARPROC*>(&PyTuple_GetItem) = GetProcAddress(m_handlePython, "PyTuple_GetItem");
427 *reinterpret_cast<FARPROC*>(&PyTuple_Size) = GetProcAddress(m_handlePython, "PyTuple_Size");
428 *reinterpret_cast<FARPROC*>(&PyString_FromString) = GetProcAddress(m_handlePython, "PyString_FromString");
429 *reinterpret_cast<FARPROC*>(&PyCFunction_NewEx) = GetProcAddress(m_handlePython, "PyCFunction_NewEx");
430 *reinterpret_cast<FARPROC*>(&PySys_GetObject) = GetProcAddress(m_handlePython, "PySys_GetObject");
431 *reinterpret_cast<FARPROC*>(&PySys_SetObject) = GetProcAddress(m_handlePython, "PySys_SetObject");
432 *reinterpret_cast<FARPROC*>(&PySys_SetArgv) = !isPy3 ? GetProcAddress(m_handlePython, "PySys_SetArgv") : 0 ;
433 *reinterpret_cast<FARPROC*>(&PySys_SetArgv_Py3) = isPy3 ? GetProcAddress(m_handlePython, "PySys_SetArgv") : 0;
434 *reinterpret_cast<FARPROC*>(&PyString_FromString) = GetProcAddress(m_handlePython, "PyString_FromString");
435 *reinterpret_cast<FARPROC*>(&PyString_AsString) = GetProcAddress(m_handlePython, "PyString_AsString");
436 *reinterpret_cast<FARPROC*>(&PyErr_Fetch) = GetProcAddress(m_handlePython, "PyErr_Fetch");
437 *reinterpret_cast<FARPROC*>(&PyErr_NormalizeException) = GetProcAddress(m_handlePython, "PyErr_NormalizeException");
438 *reinterpret_cast<FARPROC*>(&PyErr_SetString) = GetProcAddress(m_handlePython, "PyErr_SetString");
439 *reinterpret_cast<FARPROC*>(&PyErr_Clear) = GetProcAddress(m_handlePython, "PyErr_Clear");
440 *reinterpret_cast<FARPROC*>(&PyImport_AddModule) = GetProcAddress(m_handlePython, "PyImport_AddModule");
441 *reinterpret_cast<FARPROC*>(&PyImport_ImportModule) = GetProcAddress(m_handlePython, "PyImport_ImportModule");
442 *reinterpret_cast<FARPROC*>(&PyClass_New) = GetProcAddress(m_handlePython, "PyClass_New");
443 *reinterpret_cast<FARPROC*>(&PyInstance_New) = GetProcAddress(m_handlePython, "PyInstance_New");
444 *reinterpret_cast<FARPROC*>(&PyMethod_New) = GetProcAddress(m_handlePython, "PyMethod_New");
445 *reinterpret_cast<FARPROC*>(&PyCapsule_New) = GetProcAddress(m_handlePython, "PyCapsule_New");
446 *reinterpret_cast<FARPROC*>(&PyCapsule_GetPointer) = GetProcAddress(m_handlePython, "PyCapsule_GetPointer");
447 *reinterpret_cast<FARPROC*>(&PyObject_SetAttrString) = GetProcAddress(m_handlePython, "PyObject_SetAttrString");
448 *reinterpret_cast<FARPROC*>(&PyUnicode_FromWideChar) = isPy3 ? GetProcAddress(m_handlePython, "PyUnicode_FromWideChar") :
449 GetProcAddress(m_handlePython, "PyUnicodeUCS2_FromWideChar");
450 *reinterpret_cast<FARPROC*>(&PyImport_Import) = GetProcAddress(m_handlePython, "PyImport_Import");
451 *reinterpret_cast<FARPROC*>(&PyBool_FromLong) = GetProcAddress(m_handlePython, "PyBool_FromLong");
452 *reinterpret_cast<FARPROC*>(&PyList_Size) = GetProcAddress(m_handlePython, "PyList_Size");
453 *reinterpret_cast<FARPROC*>(&PyList_GetItem) = GetProcAddress(m_handlePython, "PyList_GetItem");
454 *reinterpret_cast<FARPROC*>(&PyFile_FromString) = GetProcAddress(m_handlePython, "PyFile_FromString");
455 *reinterpret_cast<FARPROC*>(&PyFile_AsFile) = GetProcAddress(m_handlePython, "PyFile_AsFile");
456 *reinterpret_cast<FARPROC*>(&PyUnicode_FromString) = GetProcAddress(m_handlePython, "PyUnicode_FromString");
457 *reinterpret_cast<FARPROC*>(&PyInstanceMethod_New) = GetProcAddress(m_handlePython, "PyInstanceMethod_New");
458 *reinterpret_cast<FARPROC*>(&PyUnicode_AsWideChar) = GetProcAddress(m_handlePython, "PyUnicode_AsWideChar");
459 *reinterpret_cast<FARPROC*>(&_Py_fopen) = GetProcAddress(m_handlePython, "_Py_fopen");
460 *reinterpret_cast<FARPROC*>(&Py_AddPendingCall) = GetProcAddress(m_handlePython, "Py_AddPendingCall");
461 *reinterpret_cast<FARPROC*>(&PyGILState_Ensure) = GetProcAddress(m_handlePython, "PyGILState_Ensure");
462 *reinterpret_cast<FARPROC*>(&PyGILState_Release) = GetProcAddress(m_handlePython, "PyGILState_Release");
463 *reinterpret_cast<FARPROC*>(&PyDescr_NewMethod) = GetProcAddress(m_handlePython, "PyDescr_NewMethod");
464
465 Py_Initialize();
466 PyEval_InitThreads();
467
468 m_globalState = PyEval_SaveThread();
469}
470
471
472PyModule::~PyModule()
473{
474 assert(0);
475
476 //if (m_globalInterpreter)
477 //{
478 // delete m_globalInterpreter;
479 // m_globalInterpreter = 0;
480 //}
481
482 //PyThreadState_Swap(m_globalState);
483
484 //Py_Finalize();
485
486 //FreeLibrary(m_handlePython);
487}
488
489
490void PyModule::deactivate()
491{
492 if (m_globalInterpreter)
493 {
494 delete m_globalInterpreter;
495 m_globalInterpreter = 0;
496 }
497
498 PyThreadState_Swap(m_globalState);
499
500 if (m_pykdInit)
501 {
502 PyObject* mainName = isPy3 ? PyUnicode_FromString("__main__") : PyString_FromString("__main__");
503 PyObject* mainMod = PyImport_Import(mainName);
504 PyObject* globals = PyObject_GetAttrString(mainMod, "__dict__");
505 PyObject* result = PyRun_String("__import__('pykd').deinitialize()\n", Py_file_input, globals, globals);
506
507 if (mainName) Py_DecRef(mainName);
508 if (mainMod) Py_DecRef(mainMod);
509 if (globals) Py_DecRef(globals);
510 if (result) Py_DecRef(result);
511
512 m_pykdInit = false;
513 }
514
515 m_globalState = PyEval_SaveThread();
516}
517
518void PyModule::checkPykd()
519{
520
521 PyObject *mainName = 0, *mainMod = 0, *globals = 0, *result = 0;
522
523 do {
524 if (m_pykdInit)
525 break;
526
527 mainName = isPy3 ? PyUnicode_FromString("__main__") : PyString_FromString("__main__");
528 if (!mainName)
529 break;
530
531 mainMod = PyImport_Import(mainName);
532 if (!mainMod)
533 break;
534
535 globals = PyObject_GetAttrString(mainMod, "__dict__");
536 if (!globals)
537 break;
538
539 result = PyRun_String("__import__('pykd').initialize()\n", Py_file_input, globals, globals);
540 if (!result)
541 break;
542
543 m_pykdInit = true;
544
545 } while( false);
546
547 if (mainName) Py_DecRef(mainName);
548 if (mainMod) Py_DecRef(mainMod);
549 if (globals) Py_DecRef(globals);
550 if (result) Py_DecRef(result);
551}
552
553PythonInterpreter* activateInterpreter(bool global, int majorVersion, int minorVersion)
554{
555 return PythonSingleton::get()->getInterpreter(majorVersion, minorVersion, global);
556}
557
558void releaseInterpretor(PythonInterpreter* interpret)
559{
560 PythonSingleton::get()->releaseInterpretor(interpret);
561}
562
563bool isInterpreterLoaded(int majorVersion, int minorVersion)
564{
565 return PythonSingleton::get()->isInterpreterLoaded(majorVersion, minorVersion);
566}
567
568void stopAllInterpreter()
569{
570 PythonSingleton::get()->stopAllInterpreter();
571}
572
573void checkPykd()
574{
575 PythonSingleton::get()->checkPykd();
576}
577
578void __stdcall Py_IncRef(PyObject* object)
579{
580 PythonSingleton::get()->currentInterpreter()->m_module->Py_IncRef(object);
581}
582
583void __stdcall Py_DecRef(PyObject* object)
584{
585 PythonSingleton::get()->currentInterpreter()->m_module->Py_DecRef(object);
586}
587
588PyObject* __stdcall PyString_FromString(const char *v)
589{
590 return PythonSingleton::get()->currentInterpreter()->m_module->PyString_FromString(v);
591}
592
593PyObject* __stdcall PyDict_New()
594{
595 return PythonSingleton::get()->currentInterpreter()->m_module->PyDict_New();
596}
597
598PyObject* __stdcall PyDict_GetItemString(PyObject *p, const char *key)
599{
600 return PythonSingleton::get()->currentInterpreter()->m_module->PyDict_GetItemString(p, key);
601}
602
603int __stdcall PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)
604{
605 return PythonSingleton::get()->currentInterpreter()->m_module->PyDict_SetItemString(p, key, val);
606}
607
608PyObject* __stdcall PyCFunction_NewEx(PyMethodDef* pydef, PyObject *p1, PyObject *p2)
609{
610 return PythonSingleton::get()->currentInterpreter()->m_module->PyCFunction_NewEx(pydef, p1, p2);
611}
612
613PyObject* __stdcall PyClass_New(PyObject* className, PyObject* classBases, PyObject* classDict)
614{
615 return PythonSingleton::get()->currentInterpreter()->m_module->PyClass_New(className, classBases, classDict);
616}
617
618PyObject* __stdcall PyMethod_New(PyObject *func, PyObject *self, PyObject *classobj)
619{
620 return PythonSingleton::get()->currentInterpreter()->m_module->PyMethod_New(func, self, classobj);
621}
622
623int __stdcall PySys_SetObject(char *name, PyObject *v)
624{
625 return PythonSingleton::get()->currentInterpreter()->m_module->PySys_SetObject(name, v);
626}
627
628void __stdcall PySys_SetArgv(int argc, char **argv)
629{
630 PythonSingleton::get()->currentInterpreter()->m_module->PySys_SetArgv(argc, argv);
631}
632
633void __stdcall PySys_SetArgv_Py3(int argc, wchar_t **argv)
634{
635 PythonSingleton::get()->currentInterpreter()->m_module->PySys_SetArgv_Py3(argc, argv);
636}
637
638PyObject* __stdcall PySys_GetObject(char *name)
639{
640 return PythonSingleton::get()->currentInterpreter()->m_module->PySys_GetObject(name);
641}
642
643PyObject* __stdcall PyInstance_New(PyObject *classobj, PyObject *arg, PyObject *kw)
644{
645 return PythonSingleton::get()->currentInterpreter()->m_module->PyInstance_New(classobj, arg, kw);
646}
647
648int __stdcall PyRun_SimpleString(const char* str)
649{
650 return PythonSingleton::get()->currentInterpreter()->m_module->PyRun_SimpleString(str);
651}
652
653PyObject* __stdcall PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
654{
655 return PythonSingleton::get()->currentInterpreter()->m_module->PyRun_String(str, start, globals, locals);
656}
657
658PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
659{
660 return PythonSingleton::get()->currentInterpreter()->m_module->PyCapsule_New(pointer, name, destructor);
661}
662
663void* PyCapsule_GetPointer(PyObject *capsule, const char *name)
664{
665 return PythonSingleton::get()->currentInterpreter()->m_module->PyCapsule_GetPointer(capsule, name);
666}
667
668int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)
669{
670 return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_SetAttrString(o, attr_name, v);
671}
672
673PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)
674{
675 return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_GetAttrString(o, attr_name);
676}
677
678PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args)
679{
680 return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_CallObject(callable_object, args);
681}
682
683PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw)
684{
685 return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_Call(callable_object, args, kw);
686}
687
688PyObject* __stdcall PyTuple_New(size_t len)
689{
690 return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_New(len);
691}
692
693PyObject* __stdcall PyTuple_GetItem(PyObject *p, size_t pos)
694{
695 return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_GetItem(p, pos);
696}
697
698int __stdcall PyTuple_SetItem(PyObject *p, size_t pos, PyObject *obj)
699{
700 return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_SetItem(p, pos, obj);
701}
702
703size_t __stdcall PyTuple_Size(PyObject *p)
704{
705 return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_Size(p);
706}
707
708char* PyString_AsString(PyObject *string)
709{
710 return PythonSingleton::get()->currentInterpreter()->m_module->PyString_AsString(string);
711}
712
713PyObject* PyUnicode_FromWideChar(const wchar_t *w, size_t size)
714{
715 return PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_FromWideChar(w, size);
716}
717
718PyObject* PyImport_Import(PyObject *name)
719{
720 return PythonSingleton::get()->currentInterpreter()->m_module->PyImport_Import(name);
721}
722
723PyObject* PyBool_FromLong(long v)
724{
725 return PythonSingleton::get()->currentInterpreter()->m_module->PyBool_FromLong(v);
726}
727
728PyObject* Py_None()
729{
730 return PythonSingleton::get()->currentInterpreter()->m_module->Py_None;
731}
732
733PyObject* PyExc_SystemExit()
734{
735 return PythonSingleton::get()->currentInterpreter()->m_module->PyExc_SystemExit;
736}
737
738PyObject* PyType_Type()
739{
740 return PythonSingleton::get()->currentInterpreter()->m_module->PyType_Type;
741}
742
743PyObject* PyProperty_Type()
744{
745 return PythonSingleton::get()->currentInterpreter()->m_module->PyProperty_Type;
746}
747
748void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
749{
750 PythonSingleton::get()->currentInterpreter()->m_module->PyErr_Fetch(ptype, pvalue, ptraceback);
751}
752
753
754void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)
755{
756 PythonSingleton::get()->currentInterpreter()->m_module->PyErr_NormalizeException(exc, val, tb);
757}
758
759void PyErr_Clear()
760{
761 PythonSingleton::get()->currentInterpreter()->m_module->PyErr_Clear();
762}
763
764void PyErr_SetString(PyObject *type, const char *message)
765{
766 PythonSingleton::get()->currentInterpreter()->m_module->PyErr_SetString(type, message);
767}
768
769size_t PyList_Size(PyObject* list)
770{
771 return PythonSingleton::get()->currentInterpreter()->m_module->PyList_Size(list);
772}
773
774PyObject* PyList_GetItem(PyObject *list, size_t index)
775{
776 return PythonSingleton::get()->currentInterpreter()->m_module->PyList_GetItem(list, index);
777}
778
779PyObject* PyFile_FromString(char *filename, char *mode)
780{
781 return PythonSingleton::get()->currentInterpreter()->m_module->PyFile_FromString(filename, mode);
782}
783
784FILE* PyFile_AsFile(PyObject *pyfile)
785{
786 return PythonSingleton::get()->currentInterpreter()->m_module->PyFile_AsFile(pyfile);
787}
788
789PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
790{
791 return PythonSingleton::get()->currentInterpreter()->m_module->PyRun_File(fp, filename, start, globals, locals);
792}
793
794PyObject* __stdcall PyUnicode_FromString(const char* str)
795{
796 return PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_FromString(str);
797}
798
799PyObject* __stdcall PyInstanceMethod_New(PyObject *func)
800{
801 return PythonSingleton::get()->currentInterpreter()->m_module->PyInstanceMethod_New(func);
802}
803
804size_t __stdcall PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, size_t size)
805{
806 return PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_AsWideChar(unicode, w, size);
807}
808
809PyObject* __stdcall PyImport_ImportModule(const char *name)
810{
811 return PythonSingleton::get()->currentInterpreter()->m_module->PyImport_ImportModule(name);
812}
813
814PyThreadState* __stdcall PyEval_SaveThread()
815{
816 return PythonSingleton::get()->currentInterpreter()->m_module->PyEval_SaveThread();
817}
818
819void __stdcall PyEval_RestoreThread(PyThreadState *tstate)
820{
821 PythonSingleton::get()->currentInterpreter()->m_module->PyEval_RestoreThread(tstate);
822}
823
824FILE* _Py_fopen(const char* filename, const char* mode)
825{
826 return PythonSingleton::get()->currentInterpreter()->m_module->_Py_fopen(filename, mode);
827}
828
829int __stdcall Py_AddPendingCall(int(*func)(void *), void *arg)
830{
831 return PythonSingleton::get()->currentInterpreter()->m_module->Py_AddPendingCall(func, arg);
832}
833
834PyGILState_STATE __stdcall PyGILState_Ensure()
835{
836 return PythonSingleton::get()->currentInterpreter()->m_module->PyGILState_Ensure();
837}
838
839void __stdcall PyGILState_Release(PyGILState_STATE state)
840{
841 PythonSingleton::get()->currentInterpreter()->m_module->PyGILState_Release(state);
842}
843
844PyObject* __stdcall PyDescr_NewMethod(PyObject* type, struct PyMethodDef *meth)
845{
846 return PythonSingleton::get()->currentInterpreter()->m_module->PyDescr_NewMethod(type, meth);
847}
848
849
850
851bool IsPy3()
852{
853 return PythonSingleton::get()->currentInterpreter()->m_module->isPy3;
854}
855
856