mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 03:23:23 +08:00
[pykd_ext_2.0] fixed : issue #14093 (Crash when printing unicode)
git-svn-id: https://pykd.svn.codeplex.com/svn@91214 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
45942008eb
commit
a0a7ef8196
@ -29,6 +29,7 @@ void __stdcall Py_DecRef(PyObject* object);
|
|||||||
|
|
||||||
PyObject* __stdcall PyString_FromString(const char *v);
|
PyObject* __stdcall PyString_FromString(const char *v);
|
||||||
char* PyString_AsString(PyObject *string);
|
char* PyString_AsString(PyObject *string);
|
||||||
|
int PyString_Check(PyObject *o);
|
||||||
|
|
||||||
PyObject* PyImport_Import(PyObject *name);
|
PyObject* PyImport_Import(PyObject *name);
|
||||||
PyObject* __stdcall PyImport_ImportModule(const char *name);
|
PyObject* __stdcall PyImport_ImportModule(const char *name);
|
||||||
@ -72,12 +73,15 @@ int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v);
|
|||||||
PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name);
|
PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name);
|
||||||
PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);
|
PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);
|
||||||
PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw);
|
PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw);
|
||||||
|
|
||||||
PyObject* PyUnicode_FromWideChar(const wchar_t *w, size_t size);
|
PyObject* PyUnicode_FromWideChar(const wchar_t *w, size_t size);
|
||||||
|
int PyUnicode_Check(PyObject *o);
|
||||||
|
|
||||||
PyObject* PyBool_FromLong(long v);
|
PyObject* PyBool_FromLong(long v);
|
||||||
|
|
||||||
PyObject* Py_None();
|
PyObject* Py_None();
|
||||||
PyObject* PyExc_SystemExit();
|
PyObject* PyExc_SystemExit();
|
||||||
|
PyObject* PyExc_TypeError();
|
||||||
PyObject* PyType_Type();
|
PyObject* PyType_Type();
|
||||||
PyObject* PyProperty_Type();
|
PyObject* PyProperty_Type();
|
||||||
|
|
||||||
|
@ -8,26 +8,41 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
class convert_python_exception : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
convert_python_exception(const char* message) : std::exception(message)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct convert_from_python
|
struct convert_from_python
|
||||||
{
|
{
|
||||||
convert_from_python(PyObject* obj) : m_obj(obj){}
|
convert_from_python(PyObject* obj) : m_obj(obj){}
|
||||||
|
|
||||||
operator std::wstring()
|
operator std::wstring()
|
||||||
{
|
{
|
||||||
if (IsPy3())
|
if ( PyUnicode_Check(m_obj) )
|
||||||
{
|
{
|
||||||
std::vector<wchar_t> buf(0x10000);
|
std::vector<wchar_t> buf(0x10000);
|
||||||
size_t len = buf.size();
|
size_t len = buf.size();
|
||||||
len = PyUnicode_AsWideChar(m_obj, &buf[0], len);
|
len = PyUnicode_AsWideChar(m_obj, &buf[0], len);
|
||||||
return std::wstring(&buf[0], len);
|
return std::wstring(&buf[0], len);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if ( !IsPy3() && PyString_Check(m_obj) )
|
||||||
|
{
|
||||||
return std::wstring(_bstr_t(PyString_AsString(m_obj)));
|
return std::wstring(_bstr_t(PyString_AsString(m_obj)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw convert_python_exception("failed convert argument");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
operator std::string()
|
operator std::string()
|
||||||
{
|
{
|
||||||
if (IsPy3())
|
if (PyUnicode_Check(m_obj))
|
||||||
{
|
{
|
||||||
std::vector<wchar_t> buf(0x10000);
|
std::vector<wchar_t> buf(0x10000);
|
||||||
size_t len = buf.size();
|
size_t len = buf.size();
|
||||||
@ -35,10 +50,15 @@ struct convert_from_python
|
|||||||
std::wstring str(&buf[0], len);
|
std::wstring str(&buf[0], len);
|
||||||
return std::string(_bstr_t(str.c_str()));
|
return std::string(_bstr_t(str.c_str()));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if ( !IsPy3() && PyString_Check(m_obj) )
|
||||||
|
{
|
||||||
return std::string(PyString_AsString(m_obj));
|
return std::string(PyString_AsString(m_obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw convert_python_exception("failed convert argument");
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* m_obj;
|
PyObject* m_obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -116,12 +136,17 @@ static PyObject* getPythonClass() { \
|
|||||||
struct Call_##fn { \
|
struct Call_##fn { \
|
||||||
static PyObject* pycall(PyObject *s, PyObject *args) \
|
static PyObject* pycall(PyObject *s, PyObject *args) \
|
||||||
{ \
|
{ \
|
||||||
|
try { \
|
||||||
PyObject* self = PyTuple_GetItem(args, 0); \
|
PyObject* self = PyTuple_GetItem(args, 0); \
|
||||||
PyObject* cppobj = PyObject_GetAttrString(self, "cppobject"); \
|
PyObject* cppobj = PyObject_GetAttrString(self, "cppobject"); \
|
||||||
T* _this = reinterpret_cast<T*>(PyCapsule_GetPointer(cppobj, "cppobject")); \
|
T* _this = reinterpret_cast<T*>(PyCapsule_GetPointer(cppobj, "cppobject")); \
|
||||||
Py_DecRef(cppobj); \
|
Py_DecRef(cppobj); \
|
||||||
return _this->callMethod0(&fn); \
|
return _this->callMethod0(&fn); \
|
||||||
} \
|
} \
|
||||||
|
catch(convert_python_exception& exc) \
|
||||||
|
{ PyErr_SetString(PyExc_TypeError(), exc.what()); } \
|
||||||
|
return Py_None(); \
|
||||||
|
} \
|
||||||
}; \
|
}; \
|
||||||
{\
|
{\
|
||||||
static PyMethodDef methodDef = { name, Call_##fn::pycall, METH_VARARGS }; \
|
static PyMethodDef methodDef = { name, Call_##fn::pycall, METH_VARARGS }; \
|
||||||
|
@ -61,6 +61,9 @@ public:
|
|||||||
PyObject* PyProperty_Type;
|
PyObject* PyProperty_Type;
|
||||||
PyObject* Py_None;
|
PyObject* Py_None;
|
||||||
PyObject* PyExc_SystemExit;
|
PyObject* PyExc_SystemExit;
|
||||||
|
PyObject* PyExc_TypeError;
|
||||||
|
PyObject* PyUnicode_Type;
|
||||||
|
PyObject* PyString_Type;
|
||||||
|
|
||||||
PyThreadState* PyThreadState_Current;
|
PyThreadState* PyThreadState_Current;
|
||||||
|
|
||||||
@ -111,7 +114,8 @@ public:
|
|||||||
PyObject* ( *PyMethod_New)(PyObject *func, PyObject *self, PyObject *classobj);
|
PyObject* ( *PyMethod_New)(PyObject *func, PyObject *self, PyObject *classobj);
|
||||||
PyObject* ( *PyCapsule_New)(void *pointer, const char *name, PyCapsule_Destructor destructor);
|
PyObject* ( *PyCapsule_New)(void *pointer, const char *name, PyCapsule_Destructor destructor);
|
||||||
void* ( *PyCapsule_GetPointer)(PyObject *capsule, const char *name);
|
void* ( *PyCapsule_GetPointer)(PyObject *capsule, const char *name);
|
||||||
int( *PyObject_SetAttrString)(PyObject *o, const char *attr_name, PyObject *v);
|
int ( *PyObject_SetAttrString)(PyObject *o, const char *attr_name, PyObject *v);
|
||||||
|
int ( *PyObject_IsInstance)(PyObject *inst, PyObject *cls);
|
||||||
PyObject* ( *PyUnicode_FromWideChar)(const wchar_t *w, size_t size);
|
PyObject* ( *PyUnicode_FromWideChar)(const wchar_t *w, size_t size);
|
||||||
PyObject* ( *PyBool_FromLong)(long v);
|
PyObject* ( *PyBool_FromLong)(long v);
|
||||||
size_t( *PyList_Size)(PyObject* list);
|
size_t( *PyList_Size)(PyObject* list);
|
||||||
@ -405,10 +409,12 @@ PyModule::PyModule(int majorVesion, int minorVersion)
|
|||||||
|
|
||||||
*reinterpret_cast<FARPROC*>(&PyType_Type) = GetProcAddress(m_handlePython, "PyType_Type");
|
*reinterpret_cast<FARPROC*>(&PyType_Type) = GetProcAddress(m_handlePython, "PyType_Type");
|
||||||
*reinterpret_cast<FARPROC*>(&PyProperty_Type) = GetProcAddress(m_handlePython, "PyProperty_Type");
|
*reinterpret_cast<FARPROC*>(&PyProperty_Type) = GetProcAddress(m_handlePython, "PyProperty_Type");
|
||||||
|
*reinterpret_cast<FARPROC*>(&PyUnicode_Type) = GetProcAddress(m_handlePython, "PyUnicode_Type");
|
||||||
|
*reinterpret_cast<FARPROC*>(&PyString_Type) = GetProcAddress(m_handlePython, "PyString_Type");
|
||||||
*reinterpret_cast<FARPROC*>(&Py_None) = GetProcAddress(m_handlePython, "_Py_NoneStruct");
|
*reinterpret_cast<FARPROC*>(&Py_None) = GetProcAddress(m_handlePython, "_Py_NoneStruct");
|
||||||
PyExc_SystemExit = *reinterpret_cast<PyObject**>(GetProcAddress(m_handlePython, "PyExc_SystemExit"));
|
PyExc_SystemExit = *reinterpret_cast<PyObject**>(GetProcAddress(m_handlePython, "PyExc_SystemExit"));
|
||||||
|
PyExc_TypeError= *reinterpret_cast<PyObject**>(GetProcAddress(m_handlePython, "PyExc_TypeError"));
|
||||||
PyThreadState_Current = reinterpret_cast<PyThreadState*>(GetProcAddress(m_handlePython, "_PyThreadState_Current"));
|
PyThreadState_Current = reinterpret_cast<PyThreadState*>(GetProcAddress(m_handlePython, "_PyThreadState_Current"));
|
||||||
|
|
||||||
*reinterpret_cast<FARPROC*>(&Py_Initialize) = GetProcAddress(m_handlePython, "Py_Initialize");
|
*reinterpret_cast<FARPROC*>(&Py_Initialize) = GetProcAddress(m_handlePython, "Py_Initialize");
|
||||||
*reinterpret_cast<FARPROC*>(&Py_Finalize) = GetProcAddress(m_handlePython, "Py_Finalize");
|
*reinterpret_cast<FARPROC*>(&Py_Finalize) = GetProcAddress(m_handlePython, "Py_Finalize");
|
||||||
*reinterpret_cast<FARPROC*>(&Py_NewInterpreter) = GetProcAddress(m_handlePython, "Py_NewInterpreter");
|
*reinterpret_cast<FARPROC*>(&Py_NewInterpreter) = GetProcAddress(m_handlePython, "Py_NewInterpreter");
|
||||||
@ -432,6 +438,7 @@ PyModule::PyModule(int majorVesion, int minorVersion)
|
|||||||
*reinterpret_cast<FARPROC*>(&PyObject_GetAttrString) = GetProcAddress(m_handlePython, "PyObject_GetAttrString");
|
*reinterpret_cast<FARPROC*>(&PyObject_GetAttrString) = GetProcAddress(m_handlePython, "PyObject_GetAttrString");
|
||||||
*reinterpret_cast<FARPROC*>(&PyObject_SetAttr) = GetProcAddress(m_handlePython, "PyObject_SetAttr");
|
*reinterpret_cast<FARPROC*>(&PyObject_SetAttr) = GetProcAddress(m_handlePython, "PyObject_SetAttr");
|
||||||
*reinterpret_cast<FARPROC*>(&PyObject_CallObject) = GetProcAddress(m_handlePython, "PyObject_CallObject");
|
*reinterpret_cast<FARPROC*>(&PyObject_CallObject) = GetProcAddress(m_handlePython, "PyObject_CallObject");
|
||||||
|
*reinterpret_cast<FARPROC*>(&PyObject_IsInstance) = GetProcAddress(m_handlePython, "PyObject_IsInstance");
|
||||||
*reinterpret_cast<FARPROC*>(&PyTuple_New) = GetProcAddress(m_handlePython, "PyTuple_New");
|
*reinterpret_cast<FARPROC*>(&PyTuple_New) = GetProcAddress(m_handlePython, "PyTuple_New");
|
||||||
*reinterpret_cast<FARPROC*>(&PyTuple_SetItem) = GetProcAddress(m_handlePython, "PyTuple_SetItem");
|
*reinterpret_cast<FARPROC*>(&PyTuple_SetItem) = GetProcAddress(m_handlePython, "PyTuple_SetItem");
|
||||||
*reinterpret_cast<FARPROC*>(&PyTuple_GetItem) = GetProcAddress(m_handlePython, "PyTuple_GetItem");
|
*reinterpret_cast<FARPROC*>(&PyTuple_GetItem) = GetProcAddress(m_handlePython, "PyTuple_GetItem");
|
||||||
@ -459,6 +466,8 @@ PyModule::PyModule(int majorVesion, int minorVersion)
|
|||||||
*reinterpret_cast<FARPROC*>(&PyObject_SetAttrString) = GetProcAddress(m_handlePython, "PyObject_SetAttrString");
|
*reinterpret_cast<FARPROC*>(&PyObject_SetAttrString) = GetProcAddress(m_handlePython, "PyObject_SetAttrString");
|
||||||
*reinterpret_cast<FARPROC*>(&PyUnicode_FromWideChar) = isPy3 ? GetProcAddress(m_handlePython, "PyUnicode_FromWideChar") :
|
*reinterpret_cast<FARPROC*>(&PyUnicode_FromWideChar) = isPy3 ? GetProcAddress(m_handlePython, "PyUnicode_FromWideChar") :
|
||||||
GetProcAddress(m_handlePython, "PyUnicodeUCS2_FromWideChar");
|
GetProcAddress(m_handlePython, "PyUnicodeUCS2_FromWideChar");
|
||||||
|
*reinterpret_cast<FARPROC*>(&PyUnicode_AsWideChar) = isPy3 ? GetProcAddress(m_handlePython, "PyUnicode_AsWideChar") :
|
||||||
|
GetProcAddress(m_handlePython, "PyUnicodeUCS2_AsWideChar");
|
||||||
*reinterpret_cast<FARPROC*>(&PyImport_Import) = GetProcAddress(m_handlePython, "PyImport_Import");
|
*reinterpret_cast<FARPROC*>(&PyImport_Import) = GetProcAddress(m_handlePython, "PyImport_Import");
|
||||||
*reinterpret_cast<FARPROC*>(&PyImport_AddModule) = GetProcAddress(m_handlePython, "PyImport_AddModule");
|
*reinterpret_cast<FARPROC*>(&PyImport_AddModule) = GetProcAddress(m_handlePython, "PyImport_AddModule");
|
||||||
*reinterpret_cast<FARPROC*>(&PyBool_FromLong) = GetProcAddress(m_handlePython, "PyBool_FromLong");
|
*reinterpret_cast<FARPROC*>(&PyBool_FromLong) = GetProcAddress(m_handlePython, "PyBool_FromLong");
|
||||||
@ -468,7 +477,7 @@ PyModule::PyModule(int majorVesion, int minorVersion)
|
|||||||
*reinterpret_cast<FARPROC*>(&PyFile_AsFile) = GetProcAddress(m_handlePython, "PyFile_AsFile");
|
*reinterpret_cast<FARPROC*>(&PyFile_AsFile) = GetProcAddress(m_handlePython, "PyFile_AsFile");
|
||||||
*reinterpret_cast<FARPROC*>(&PyUnicode_FromString) = GetProcAddress(m_handlePython, "PyUnicode_FromString");
|
*reinterpret_cast<FARPROC*>(&PyUnicode_FromString) = GetProcAddress(m_handlePython, "PyUnicode_FromString");
|
||||||
*reinterpret_cast<FARPROC*>(&PyInstanceMethod_New) = GetProcAddress(m_handlePython, "PyInstanceMethod_New");
|
*reinterpret_cast<FARPROC*>(&PyInstanceMethod_New) = GetProcAddress(m_handlePython, "PyInstanceMethod_New");
|
||||||
*reinterpret_cast<FARPROC*>(&PyUnicode_AsWideChar) = GetProcAddress(m_handlePython, "PyUnicode_AsWideChar");
|
|
||||||
*reinterpret_cast<FARPROC*>(&_Py_fopen) = GetProcAddress(m_handlePython, "_Py_fopen");
|
*reinterpret_cast<FARPROC*>(&_Py_fopen) = GetProcAddress(m_handlePython, "_Py_fopen");
|
||||||
*reinterpret_cast<FARPROC*>(&Py_AddPendingCall) = GetProcAddress(m_handlePython, "Py_AddPendingCall");
|
*reinterpret_cast<FARPROC*>(&Py_AddPendingCall) = GetProcAddress(m_handlePython, "Py_AddPendingCall");
|
||||||
*reinterpret_cast<FARPROC*>(&PyGILState_Ensure) = GetProcAddress(m_handlePython, "PyGILState_Ensure");
|
*reinterpret_cast<FARPROC*>(&PyGILState_Ensure) = GetProcAddress(m_handlePython, "PyGILState_Ensure");
|
||||||
@ -708,6 +717,11 @@ PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw)
|
|||||||
return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_Call(callable_object, args, kw);
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_Call(callable_object, args, kw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PyObject_IsInstance(PyObject *inst, PyObject *cls)
|
||||||
|
{
|
||||||
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_IsInstance(inst,cls);
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* __stdcall PyTuple_New(size_t len)
|
PyObject* __stdcall PyTuple_New(size_t len)
|
||||||
{
|
{
|
||||||
return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_New(len);
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_New(len);
|
||||||
@ -758,6 +772,11 @@ PyObject* PyExc_SystemExit()
|
|||||||
return PythonSingleton::get()->currentInterpreter()->m_module->PyExc_SystemExit;
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyExc_SystemExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* PyExc_TypeError()
|
||||||
|
{
|
||||||
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyExc_TypeError;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* PyType_Type()
|
PyObject* PyType_Type()
|
||||||
{
|
{
|
||||||
return PythonSingleton::get()->currentInterpreter()->m_module->PyType_Type;
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyType_Type;
|
||||||
@ -884,4 +903,15 @@ bool IsPy3()
|
|||||||
return PythonSingleton::get()->currentInterpreter()->m_module->isPy3;
|
return PythonSingleton::get()->currentInterpreter()->m_module->isPy3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PyString_Check(PyObject *o)
|
||||||
|
{
|
||||||
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_IsInstance(o,
|
||||||
|
PythonSingleton::get()->currentInterpreter()->m_module->PyString_Type );
|
||||||
|
}
|
||||||
|
|
||||||
|
int PyUnicode_Check(PyObject *o)
|
||||||
|
{
|
||||||
|
return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_IsInstance(o,
|
||||||
|
PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_Type );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#define PYKDEXT_VERSION_MAJOR 2
|
#define PYKDEXT_VERSION_MAJOR 2
|
||||||
#define PYKDEXT_VERSION_MINOR 0
|
#define PYKDEXT_VERSION_MINOR 0
|
||||||
#define PYKDEXT_VERSION_SUBVERSION 0
|
#define PYKDEXT_VERSION_SUBVERSION 0
|
||||||
#define PYKDEXT_VERSION_BUILDNO 11
|
#define PYKDEXT_VERSION_BUILDNO 12
|
||||||
|
|
||||||
#define __VER_STR2__(x) #x
|
#define __VER_STR2__(x) #x
|
||||||
#define __VER_STR1__(x) __VER_STR2__(x)
|
#define __VER_STR1__(x) __VER_STR2__(x)
|
||||||
|
Loading…
Reference in New Issue
Block a user