From a4ad0db86eb8c994c83275228bfd0ce570a24901 Mon Sep 17 00:00:00 2001
From: "SND\\kernelnet_cp"
 <SND\kernelnet_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Fri, 16 May 2014 08:30:38 +0000
Subject: [PATCH] [0.3.x] fixed : pykd::breakpoint class

git-svn-id: https://pykd.svn.codeplex.com/svn@88333 9b283d60-5439-405e-af05-b73fd8c4d996
---
 pykd/pyeventhandler.cpp    | 22 ++++++----------------
 pykd/pyeventhandler.h      | 12 +++++-------
 pykd/pykdver.h             |  2 +-
 pykd/pymod.cpp             | 10 +++++-----
 test/scripts/breakpoint.py | 28 ++++++++++++++++++++++++----
 5 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/pykd/pyeventhandler.cpp b/pykd/pyeventhandler.cpp
index 90e0e69..99cb0a9 100644
--- a/pykd/pyeventhandler.cpp
+++ b/pykd/pyeventhandler.cpp
@@ -384,28 +384,18 @@ void breakPointRemove( kdlib::BREAKPOINT_ID id )
 
 ///////////////////////////////////////////////////////////////////////////////
 
-kdlib::BreakpointPtr Breakpoint::setSoftwareBreakpoint( kdlib::MEMOFFSET_64 offset )
+Breakpoint::Breakpoint( kdlib::MEMOFFSET_64 offset )
 {
-    Breakpoint  *bp = new Breakpoint();
-
-    AutoRestorePyState  pystate(&bp->m_pystate);
-
-    bp->set(offset);
-
-    return kdlib::BreakpointPtr(bp);
+    AutoRestorePyState  pystate(&m_pystate);
+    set(offset);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 
-kdlib::BreakpointPtr Breakpoint::setHardwareBreakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType )
+Breakpoint::Breakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType )
 {
-    Breakpoint  *bp = new Breakpoint();
-
-    AutoRestorePyState  pystate(&bp->m_pystate);
-
-    bp->set(offset, size, accessType);
-
-    return kdlib::BreakpointPtr(bp);
+    AutoRestorePyState  pystate(&m_pystate);
+    set(offset, size, accessType);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/pykd/pyeventhandler.h b/pykd/pyeventhandler.h
index 6e16c90..a451ed5 100644
--- a/pykd/pyeventhandler.h
+++ b/pykd/pyeventhandler.h
@@ -21,8 +21,6 @@ namespace pykd {
 
 ///////////////////////////////////////////////////////////////////////////////
 
-class EventHandler;
-typedef boost::shared_ptr<EventHandler>  EventHandlerPtr;
 
 class EventHandler : public python::wrapper<kdlib::EventHandler>, public kdlib::EventHandler
 {
@@ -48,17 +46,17 @@ kdlib::BREAKPOINT_ID setHardwareBreakpoint( kdlib::MEMOFFSET_64 offset, size_t s
 void breakPointRemove( kdlib::BREAKPOINT_ID id );
 
 
-class Breakpoint : public python::wrapper<kdlib::Breakpoint>, public kdlib::BaseBreakpoint {
+class Breakpoint : public python::wrapper<kdlib::BaseBreakpoint>, public kdlib::BaseBreakpoint {
 
 public:
 
-    static kdlib::BreakpointPtr setSoftwareBreakpoint( kdlib::MEMOFFSET_64 offset );
-    static kdlib::BreakpointPtr setHardwareBreakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType );
+    Breakpoint( kdlib::MEMOFFSET_64 offset );
+    Breakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType );
+
+    virtual kdlib::DebugCallbackResult onHit();
 
 private:
 
-    kdlib::DebugCallbackResult onHit();
-
     PyThreadState*  m_pystate;
 
 };
diff --git a/pykd/pykdver.h b/pykd/pykdver.h
index c6286f1..0a5fe29 100644
--- a/pykd/pykdver.h
+++ b/pykd/pykdver.h
@@ -2,7 +2,7 @@
 #define PYKD_VERSION_MAJOR      0
 #define PYKD_VERSION_MINOR      3
 #define PYKD_VERSION_SUBVERSION 0
-#define PYKD_VERSION_BUILDNO    5
+#define PYKD_VERSION_BUILDNO    6
 
 #define __VER_STR2__(x) #x
 #define __VER_STR1__(x) __VER_STR2__(x)
diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp
index ca94b43..ad53be0 100644
--- a/pykd/pymod.cpp
+++ b/pykd/pymod.cpp
@@ -854,7 +854,7 @@ BOOST_PYTHON_MODULE( pykd )
         .value("PageExecuteWriteCopy", kdlib::PageExecuteWriteCopy)
         .export_values();
 
-    python::class_<EventHandler, EventHandlerPtr, boost::noncopyable>(
+    python::class_<EventHandler, boost::noncopyable>(
         "eventHandler", "Base class for overriding and handling debug notifications" )
          .def( "onBreakpoint", &EventHandler::onBreakpoint,
             "Triggered breakpoint event. Parameter is int: ID of breakpoint\n"
@@ -879,11 +879,11 @@ BOOST_PYTHON_MODULE( pykd )
    //         "There is no return value");
       ;
 
-   python::class_<kdlib::Breakpoint, kdlib::BreakpointPtr, boost::noncopyable>( "breakpoint",
+   python::class_<Breakpoint, boost::noncopyable>( "breakpoint",
         "class for breakpoint representation", python::no_init  )
-        .def("__init__", python::make_constructor(pykd::Breakpoint::setSoftwareBreakpoint) )
-        .def("__init__", python::make_constructor(pykd::Breakpoint::setHardwareBreakpoint) )
-        .def("onHit", &kdlib::Breakpoint::onHit,
+        .def( python::init<kdlib::MEMOFFSET_64>() )
+        .def( python::init<kdlib::MEMOFFSET_64, size_t, kdlib::ACCESS_TYPE>() )
+        .def("onHit", &Breakpoint::onHit,
             "Breakpoint hit callback")
         ;
 
diff --git a/test/scripts/breakpoint.py b/test/scripts/breakpoint.py
index bad656c..ed77784 100644
--- a/test/scripts/breakpoint.py
+++ b/test/scripts/breakpoint.py
@@ -123,15 +123,35 @@ class BreakpointTest( unittest.TestCase ):
 
             bp = MyBreakpoint( targetModule.CdeclFunc )
 
-            pykd.setBp( targetModule.CdeclFunc )
-
             self.assertEqual( pykd.Break, pykd.go() )
 
             self.assertEqual( 1, bp.count )
 
+    def testBreakpointCondition(self):
+
+        def makebpcallback(n):
+
+            def bpcallback():
+                if pykd.getParam("b") > n:
+                    return pykd.eventResult.Break
+                return pykd.eventResult.Proceed
+            return bpcallback
+
+        processId = pykd.startProcess( target.appPath + " breakhandlertest" )
+        targetModule = pykd.module( target.moduleName )
+        targetModule.reload()
+        with testutils.ContextCallIt( testutils.KillProcess(processId) ) as killStartedProcess :
+            pykd.go()
+            bp = pykd.setBp( targetModule.CdeclFunc, makebpcallback(1) )
+            self.assertEqual( pykd.Break, pykd.go() )
 
 
-
- 
+        processId = pykd.startProcess( target.appPath + " breakhandlertest" )
+        targetModule = pykd.module( target.moduleName )
+        targetModule.reload()
+        with testutils.ContextCallIt( testutils.KillProcess(processId) ) as killStartedProcess :
+            pykd.go()
+            bp = pykd.setBp( targetModule.CdeclFunc, makebpcallback(100) )
+            self.assertEqual( pykd.NoDebuggee, pykd.go() )