diff --git a/pykd/packages.pykd_vc120.config b/pykd/packages.pykd_vc120.config
index ceb9eb5..a29ebfd 100644
--- a/pykd/packages.pykd_vc120.config
+++ b/pykd/packages.pykd_vc120.config
@@ -1,6 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/pykd/pycpucontext.h b/pykd/pycpucontext.h
index 0763d93..8ea2eed 100644
--- a/pykd/pycpucontext.h
+++ b/pykd/pycpucontext.h
@@ -108,6 +108,11 @@ inline kdlib::StackFramePtr getCurrentFrame() {
return kdlib::getCurrentStackFrame();
}
+inline unsigned long getCurrentFrameNumber() {
+ AutoRestorePyState pystate;
+ return kdlib::getCurrentStackFrameNumber();
+}
+
inline void setCurrentFrame( kdlib::StackFramePtr& stackFrame) {
AutoRestorePyState pystate;
kdlib::setCurrentStackFrame(stackFrame);
diff --git a/pykd/pyeventhandler.cpp b/pykd/pyeventhandler.cpp
index 66e47b1..7da46a5 100644
--- a/pykd/pyeventhandler.cpp
+++ b/pykd/pyeventhandler.cpp
@@ -286,6 +286,28 @@ void EventHandler::onChangeLocalScope()
/////////////////////////////////////////////////////////////////////////////////
+void EventHandler::onChangeBreakpoints()
+{
+ PyEval_RestoreThread(m_pystate);
+
+ try {
+
+ python::override pythonHandler = get_override("onChangeBreakpoints");
+ if (pythonHandler)
+ {
+ pythonHandler();
+ }
+ }
+ catch (const python::error_already_set &)
+ {
+ printException();
+ }
+
+ m_pystate = PyEval_SaveThread();
+}
+
+/////////////////////////////////////////////////////////////////////////////////
+
void EventHandler::onDebugOutput(const std::wstring& text)
{
PyEval_RestoreThread( m_pystate );
diff --git a/pykd/pyeventhandler.h b/pykd/pyeventhandler.h
index ebdb7fa..e5db4c7 100644
--- a/pykd/pyeventhandler.h
+++ b/pykd/pyeventhandler.h
@@ -35,6 +35,7 @@ public:
virtual kdlib::DebugCallbackResult onModuleUnload( kdlib::MEMOFFSET_64 offset, const std::wstring &name );
virtual void onCurrentThreadChange(kdlib::THREAD_DEBUG_ID threadid);
virtual void onChangeLocalScope();
+ virtual void onChangeBreakpoints();
virtual void onDebugOutput(const std::wstring& text);
private:
diff --git a/pykd/pykd_vc120.vcxproj b/pykd/pykd_vc120.vcxproj
index 9d7fcf8..854bba2 100644
--- a/pykd/pykd_vc120.vcxproj
+++ b/pykd/pykd_vc120.vcxproj
@@ -69,7 +69,7 @@
- 445589a8
+ 50e91edb
true
diff --git a/pykd/pykd_vc120.vcxproj.filters b/pykd/pykd_vc120.vcxproj.filters
index 146649a..f125f69 100644
--- a/pykd/pykd_vc120.vcxproj.filters
+++ b/pykd/pykd_vc120.vcxproj.filters
@@ -113,6 +113,105 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp
index 713cb3c..4e34eff 100644
--- a/pykd/pymod.cpp
+++ b/pykd/pymod.cpp
@@ -355,6 +355,8 @@ BOOST_PYTHON_MODULE( pykd )
"Return a current stack as a list of stackFrame objects" );
python::def( "getFrame", pykd::getCurrentFrame,
"Return a current stack frame" );
+ python::def("getFrameNumber", pykd::getCurrentFrameNumber,
+ "Return current frame number");
python::def( "setFrame", pykd::setCurrentFrame,
"Change current local scope" );
python::def( "setFrame", pykd::setCurrentFrameByIndex,
@@ -901,6 +903,8 @@ BOOST_PYTHON_MODULE( pykd )
.def( "onChangeLocalScope", &EventHandler::onChangeLocalScope,
"The current local scope has been changed.\n"
"There is no return value" )
+ .def("onChangeBreakpoints", &EventHandler::onChangeBreakpoints,
+ "Breakpoints is changed for current process" )
.def( "onDebugOutput", &EventHandler::onDebugOutput,
"Request debug output" );