From c89fc1f823d3cce5c48e1e7f047e5efc87ed9548 Mon Sep 17 00:00:00 2001
From: "SND\\ussrhero_cp"
 <SND\ussrhero_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Sun, 4 Jan 2015 09:55:16 +0000
Subject: [PATCH] [0.3.x] added : getFrameNumber ( return current frame number
 ) [0.3.x] added : eventHandler::onChangeBreakpoints ( Breakpoints is changed
 for current process )

git-svn-id: https://pykd.svn.codeplex.com/svn@89566 9b283d60-5439-405e-af05-b73fd8c4d996
---
 pykd/packages.pykd_vc120.config |  4 ++
 pykd/pycpucontext.h             |  5 ++
 pykd/pyeventhandler.cpp         | 22 ++++++++
 pykd/pyeventhandler.h           |  1 +
 pykd/pykd_vc120.vcxproj         |  2 +-
 pykd/pykd_vc120.vcxproj.filters | 99 +++++++++++++++++++++++++++++++++
 pykd/pymod.cpp                  |  4 ++
 7 files changed, 136 insertions(+), 1 deletion(-)

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 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="boost" version="1.57.0.0" targetFramework="Native" />
+  <package id="boost_chrono" version="1.57.0.0" targetFramework="Native" />
+  <package id="boost_date_time" version="1.57.0.0" targetFramework="Native" />
   <package id="boost_python" version="1.57.0.0" targetFramework="Native" />
+  <package id="boost_system" version="1.57.0.0" targetFramework="Native" />
+  <package id="boost_thread" version="1.57.0.0" targetFramework="Native" />
   <package id="Python27" version="2.7.6" targetFramework="Native" />
 </packages>
\ 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 @@
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
   <PropertyGroup Label="UserMacros">
-    <NuGetPackageImportStamp>445589a8</NuGetPackageImportStamp>
+    <NuGetPackageImportStamp>50e91edb</NuGetPackageImportStamp>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">
     <LinkIncremental>true</LinkIncremental>
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 @@
     <ClCompile Include="pyeventhandler.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.arg_to_python_base.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.builtin_converters.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.from_python.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.registry.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.type_id.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.class.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.enum.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.function.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.function_doc_signature.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.inheritance.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.iterator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.life_support.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.pickle_support.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.stl_iterator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.dict.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.errors.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.exec.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.import.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.list.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.long.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.module.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.numeric.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.object_operators.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.object_protocol.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.slice.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.str.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.tuple.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.wrapper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\win32\boost_thread.win32.thread.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\win32\boost_thread.win32.tss_dll.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\win32\boost_thread.win32.tss_pe.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_thread.future.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_thread.tss_null.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="pykd.def">
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" );