Browse Source

super log for direct!

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

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

@@ -31,7 +31,7 @@ __all__ = ['enumerate', 'unique', 'indent', 'nonRepeatingRandomList',
 'printStack', 'printReverseStack', 'listToIndex2item', 'listToItem2index',
 'printStack', 'printReverseStack', 'listToIndex2item', 'listToItem2index',
 'pandaBreak','pandaTrace','formatTimeCompact','DestructiveScratchPad',
 'pandaBreak','pandaTrace','formatTimeCompact','DestructiveScratchPad',
 'deeptype','getProfileResultString','StdoutCapture','StdoutPassthrough',
 'deeptype','getProfileResultString','StdoutCapture','StdoutPassthrough',
-'Averager', 'getRepository', 'formatTimeExact', ]
+'Averager', 'getRepository', 'formatTimeExact', 'startSuperLog', 'endSuperLog' ]
 
 
 import types
 import types
 import string
 import string
@@ -2484,6 +2484,25 @@ def safeRepr(obj):
     except:
     except:
         return '<** FAILED REPR OF %s instance at %s **>' % (obj.__class__.__name__, hex(id(obj)))
         return '<** FAILED REPR OF %s instance at %s **>' % (obj.__class__.__name__, hex(id(obj)))
 
 
+def safeReprTypeOnFail(obj):
+    global dtoolSuperBase
+    if dtoolSuperBase is None:
+        _getDtoolSuperBase()
+
+    global safeReprNotify
+    if safeReprNotify is None:
+        _getSafeReprNotify()
+
+    if isinstance(obj, dtoolSuperBase):
+        return type(obj)
+
+    try:
+        return repr(obj)
+    except:
+        return '<** FAILED REPR OF %s instance at %s **>' % (obj.__class__.__name__, hex(id(obj)))
+
+
+
 def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None):
 def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None):
     """ caps the length of iterable types, so very large objects will print faster.
     """ caps the length of iterable types, so very large objects will print faster.
     also prevents infinite recursion """
     also prevents infinite recursion """
@@ -3781,6 +3800,7 @@ def pandaBreak(dotpath, linenum, temporary = 0, cond = None):
         filename = root + "\\src"
         filename = root + "\\src"
         for d in dirs[1:]:
         for d in dirs[1:]:
             filename="%s\\%s"%(filename,d)
             filename="%s\\%s"%(filename,d)
+        print filename
         globalPdb.set_break(filename+".py", linenum, temporary, cond)
         globalPdb.set_break(filename+".py", linenum, temporary, cond)
             
             
 class Default:
 class Default:
@@ -3788,6 +3808,33 @@ class Default:
     # useful for keyword arguments to virtual methods
     # useful for keyword arguments to virtual methods
     pass
     pass
 
 
+superLogFile = None
+def startSuperLog():
+    global superLogFile
+    
+    if(not superLogFile):
+        superLogFile = open("c:\\temp\\superLog.txt", "w")
+        def trace_dispatch(a,b,c):
+            if(b=='call' and a.f_code.co_name != '?' and a.f_code.co_name.find("safeRepr")<0):
+                vars = dict(a.f_locals)
+                if(vars.has_key('self')):
+                    del vars['self']
+                if(vars.has_key('__builtins__')):
+                    del vars['__builtins__']
+                for i in vars:
+                    vars[i] = safeReprTypeOnFail(vars[i]) 
+                superLogFile.write( "%s(%s):%s:%s\n"%(a.f_code.co_filename.split("\\")[-1],a.f_code.co_firstlineno, a.f_code.co_name, vars))
+
+                return trace_dispatch
+        sys.settrace(trace_dispatch)
+      
+def endSuperLog():
+    global superLogFile
+    if(superLogFile):
+        sys.settrace(None)
+        superLogFile.close()
+        superLogFile = None
+    
 def isInteger(n):
 def isInteger(n):
     return type(n) in (types.IntType, types.LongType)
     return type(n) in (types.IntType, types.LongType)