Browse Source

new breakpointing system

Zachary Pavlov 17 years ago
parent
commit
c2aa7b17e4
1 changed files with 54 additions and 1 deletions
  1. 54 1
      direct/src/showbase/PythonUtil.py

+ 54 - 1
direct/src/showbase/PythonUtil.py

@@ -28,7 +28,8 @@ __all__ = ['enumerate', 'unique', 'indent', 'nonRepeatingRandomList',
 'superFlattenShip','HotkeyBreaker','logMethodCalls','GoldenRatio',
 'GoldenRectangle', 'pivotScalar', 'rad90', 'rad180', 'rad270', 'rad360',
 'nullGen', 'loopGen', 'makeFlywheelGen', 'flywheel', 'choice',
-'printStack', 'printReverseStack', 'listToIndex2item', 'listToItem2index', ]
+'printStack', 'printReverseStack', 'listToIndex2item', 'listToItem2index',
+'pandaBreak','pandaTrace']
 
 import types
 import string
@@ -3314,6 +3315,58 @@ def recordFunctorCreationStacks():
             Functor._functorCreationStacksRecorded = True
             Functor.__call__ = Functor._exceptionLoggedCreationStack__call__
 
+globalPdb = None
+
+traceCalled = False
+
+def setupPdb():
+    import pdb;
+    class pandaPdb(pdb.Pdb):
+        def stop_here(self, frame):
+            global traceCalled
+            if(traceCalled):
+                result = pdb.Pdb.stop_here(self, frame)
+                if(result == True):
+                    traceCalled = False
+                return result
+            if frame is self.stopframe:
+                return True
+            return False
+    global globalPdb
+    globalPdb = pandaPdb()
+    globalPdb.reset()
+    sys.settrace(globalPdb.trace_dispatch)
+    
+def pandaTrace():
+    if __dev__:
+        if not globalPdb:
+            setupPdb()
+        global traceCalled
+        globalPdb.set_trace(sys._getframe().f_back)
+        traceCalled = True
+
+packageMap = {
+    "toontown":"$TOONTOWN",
+    "direct":"$DIRECT",
+    "otp":"$OTP",
+    "pirates":"$PIRATES",
+}
+    
+
+#assuming . dereferncing for nice linking to imports
+def pandaBreak(dotpath, linenum, temporary = 0, cond = None):
+    if __dev__:
+        from pandac.PandaModules import Filename
+        if not globalPdb:
+            setupPdb()
+        dirs = dotpath.split(".")
+        root = Filename.expandFrom(packageMap[dirs[0]]).toOsSpecific()
+        filename = root + "\\src"
+        for d in dirs[1:]:
+            filename="%s\\%s"%(filename,d)
+        globalPdb.set_break(filename+".py", linenum, temporary, cond)
+            
+
 import __builtin__
 __builtin__.Functor = Functor
 __builtin__.Stack = Stack