pykd/pykd/dbgexcept.h
SND\ussrhero_cp d97b2f08a3 [0.3.x] added : CallException class
git-svn-id: https://pykd.svn.codeplex.com/svn@91127 9b283d60-5439-405e-af05-b73fd8c4d996
2017-11-03 15:24:08 +04:00

141 lines
4.8 KiB
C++

#pragma once
#include <exception>
#include <string>
#include "kdlib/exceptions.h"
///////////////////////////////////////////////////////////////////////////////
namespace pykd {
class OverflowException : public std::exception
{
public:
OverflowException(const char* desc) : std::exception(desc)
{}
};
class AttributeException : public std::exception
{
public:
AttributeException(const char* desc) : std::exception(desc)
{}
};
template< class TExcept >
struct exceptPyType{
static python::handle<> pyExceptType;
};
template< class TExcept, class TBaseExcept = python::detail::not_specified >
class exception {
public:
exception(const std::string& className, const std::string& classDesc)
{
std::string fullName = "pykd." + className;
if (boost::is_same<TBaseExcept, python::detail::not_specified>::value)
{
exceptPyType<TExcept>::pyExceptType =
python::handle<>(PyErr_NewExceptionWithDoc(
const_cast<char*>(fullName.c_str()),
const_cast<char*>(classDesc.c_str()),
NULL,
NULL));
}
else
{
exceptPyType<TExcept>::pyExceptType =
python::handle<>(PyErr_NewExceptionWithDoc(
const_cast<char*>(fullName.c_str()),
const_cast<char*>(classDesc.c_str()),
exceptPyType<TBaseExcept>::pyExceptType.get(),
NULL));
}
python::scope().attr(className.c_str()) = exceptPyType<TExcept>::pyExceptType;
}
};
inline void dbgExceptionTranslate(const kdlib::DbgException &e)
{
if ( typeid(e).hash_code() == typeid(kdlib::MemoryException).hash_code() )
{
python::object exceptObj = python::object( exceptPyType<kdlib::MemoryException>::pyExceptType )( e.what() );
PyErr_SetObject( exceptPyType<kdlib::MemoryException>::pyExceptType.get(), exceptObj.ptr());
return;
}
if ( typeid(e).hash_code() == typeid(kdlib::SymbolException).hash_code() )
{
python::object exceptObj = python::object( exceptPyType<kdlib::SymbolException>::pyExceptType )( e.what() );
PyErr_SetObject( exceptPyType<kdlib::SymbolException>::pyExceptType.get(), exceptObj.ptr());
return;
}
if ( typeid(e).hash_code() == typeid(kdlib::TypeException).hash_code() )
{
python::object exceptObj = python::object( exceptPyType<kdlib::TypeException>::pyExceptType )( e.what() );
PyErr_SetObject( exceptPyType<kdlib::TypeException>::pyExceptType.get(), exceptObj.ptr());
return;
}
if ( typeid(e).hash_code() == typeid(kdlib::IndexException).hash_code() )
{
PyErr_SetString( PyExc_IndexError, "Index out of range");
return;
}
python::object exceptObj = python::object( exceptPyType<kdlib::DbgException>::pyExceptType )( e.what() );
PyErr_SetObject( exceptPyType<kdlib::DbgException>::pyExceptType.get(), exceptObj.ptr());
}
inline void pykdExceptionTranslate(const std::exception &e)
{
if (typeid(e).hash_code() == typeid(OverflowException).hash_code())
{
PyErr_SetString(PyExc_OverflowError, e.what());
return;
}
if (typeid(e).hash_code() == typeid(AttributeException).hash_code())
{
PyErr_SetString(PyExc_AttributeError, e.what());
return;
}
}
inline void registerExceptions()
{
pykd::exception<kdlib::DbgException>( "DbgException", "Pykd base exception class" );
pykd::exception<kdlib::MemoryException,kdlib::DbgException>( "MemoryException", "Target memory access exception class" );
pykd::exception<kdlib::SymbolException,kdlib::DbgException>( "SymbolException", "Symbol exception" );
pykd::exception<kdlib::TypeException,kdlib::SymbolException>( "TypeException", "type exception" );
pykd::exception<kdlib::CallException,kdlib::DbgException>( "CallException", "Function call exception");
pykd::exception<kdlib::CPUException,kdlib::DbgException>( "CPUException", "CPU exception");
python::register_exception_translator<kdlib::DbgException>( &dbgExceptionTranslate );
python::register_exception_translator<OverflowException>( &pykdExceptionTranslate );
python::register_exception_translator<AttributeException>(&pykdExceptionTranslate);
}
/////////////////////////////////////////////////////////////////////////////////////
void printException();
///////////////////////////////////////////////////////////////////////////////////
#define PYKD_NOT_IMPLEMENTED() throw kdlib::ImplementException( __FILE__, __LINE__, "Not Implemented" );
#define PYKD_TODO(x) throw kdlib::ImplementException( __FILE__, __LINE__, x );
}; // namespace pykd