[pypy-svn] rev 2453 - in pypy/trunk/src/pypy: objspace tool
tomek at codespeak.net
tomek at codespeak.net
Wed Dec 17 17:00:30 CET 2003
Author: tomek
Date: Wed Dec 17 17:00:30 2003
New Revision: 2453
Modified:
pypy/trunk/src/pypy/objspace/trace.py
pypy/trunk/src/pypy/tool/pydis.py
Log:
intermiedate check-in
Modified: pypy/trunk/src/pypy/objspace/trace.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/trace.py (original)
+++ pypy/trunk/src/pypy/objspace/trace.py Wed Dec 17 17:00:30 2003
@@ -33,115 +33,105 @@
return getattr(self.fn, name)
-def Trace(spacecls = StdObjSpace):
- class TraceObjSpace(spacecls):
- full_exceptions = False
+class TraceObjSpace:
+
+ def __init__(self, space):
+ self.tracing = 0
+ self.ignore_up_to_frame = None
+ self.space = space
+ method_names = [ii[0] for ii in ObjSpace.MethodTable]
+ for key in method_names:
+ if key in method_names:
+ item = getattr(self.space, key)
+ l = Tracer(key, item, self)
+ setattr(self, key, new.instancemethod(l, self, TraceObjSpace))
+
+
+ def __getattr__(self, name):
+ return getattr(self.space, name)
- def initialize(self):
- self.tracing = 0
- self.ignore_up_to_frame = None
- spacecls.initialize(self)
- method_names = [ii[0] for ii in ObjSpace.MethodTable]
- for key in method_names:
- if key in method_names:
- item = getattr(self, key)
- l = Tracer(key, item, self)
- setattr(self, key, new.instancemethod(l, self, TraceObjSpace))
- def start_tracing(self):
+ def getexecutioncontext(self):
+ return TraceExecutionContext(self)
+
+
+ def start_tracing(self):
+ self.tracing = 1
+ self.log_list = []
+
+
+ def stop_tracing(self):
+ self.tracing = 0
+
+
+ def handle_default(self, frame, opcode, opname, oparg, ins_idx):
+ return opcode, opname, "", ins_idx
+
+
+ def handle_SET_LINENO(self, frame, opcode, opname, oparg, ins_idx):
+ return opcode, opname, "%s" % oparg, ins_idx
+
+
+ def handle_LOAD_CONST(self, frame, opcode, opname, oparg, ins_idx):
+ return opcode, opname, "%s (%r)" % (oparg, frame.getconstant(oparg)), ins_idx
+
+
+ def handle_LOAD_FAST(self, frame, opcode, opname, oparg, ins_idx):
+ return opcode, opname, "%s (%s)" % (oparg, frame.getlocalvarname(oparg)), ins_idx
+
+
+ def notify_on_operation(self, name, args):
+ if self.tracing:
+ #args = [self.space.unwrap(arg) for arg in args]
+ self.log_list[-1][1].append((name, args))
+
+
+ def dump(self):
+ return self.log_list
+
+
+ def rdump(self):
+ bytecodes = []
+ res = []
+ for bytecode, ops in self.log_list:
+ bytecodes.append(bytecode)
+ if ops:
+ op = ops.pop(0)
+ res.append((op, bytecodes))
+ bytecodes = []
+ for op in ops:
+ res.append((op, []))
+
+ #the rest
+ res.append((None, bytecodes))
+ return res
+
+
+ def notify_on_bytecode(self, frame):
+
+ if not self.tracing and self.ignore_up_to_frame is frame:
self.tracing = 1
- self.log_list = []
+ self.ignore_up_to_frame = None
+
+ if self.tracing:
+ opcode, opname, oparg, ins_idx = frame.examineop()
+ handle_method = getattr(self, "handle_%s" % opname, self.handle_default)
- def stop_tracing(self):
- self.tracing = 0
+ opcode, opname, oparg, ins_idx = handle_method(frame, opcode, opname, oparg, ins_idx)
+ self.log_list.append(((opcode, opname, oparg, ins_idx), []))
+ if opname in DONT_TRACK_BYTECODES:
+ self.ignore_up_to_frame = frame
+ self.tracing = 0
- def createexecutioncontext(self):
- "Factory function for execution contexts."
- return TraceExecutionContext(self)
-
- def handle_default(self, frame, opcode, opname, oparg, ins_idx):
- return opcode, opname, "", ins_idx
-
- def handle_SET_LINENO(self, frame, opcode, opname, oparg, ins_idx):
- return opcode, opname, "%s" % oparg, ins_idx
-
- def handle_LOAD_CONST(self, frame, opcode, opname, oparg, ins_idx):
- return opcode, opname, "%s (%r)" % (oparg, frame.getconstant(oparg)), ins_idx
-
- def handle_LOAD_FAST(self, frame, opcode, opname, oparg, ins_idx):
- return opcode, opname, "%s (%s)" % (oparg, frame.getlocalvarname(oparg)), ins_idx
-
- def notify_on_bytecode(self, frame):
- if not self.tracing and self.ignore_up_to_frame is frame:
- self.tracing = 1
- self.ignore_up_to_frame = None
- if self.tracing:
- opcode, opname, oparg, ins_idx = frame.examineop()
- handle_method = getattr(self, "handle_%s" % opname, self.handle_default)
-
- opcode, opname, oparg, ins_idx = handle_method(frame, opcode, opname, oparg, ins_idx)
- self.log_list.append(((opcode, opname, oparg, ins_idx), []))
- if opname in DONT_TRACK_BYTECODES:
- self.ignore_up_to_frame = frame
- self.tracing = 0
-
-
- def notify_on_operation(self, name, args):
- if self.tracing:
- self.log_list[-1][1].append((name, args))
-
-
- def dump(self):
- return self.log_list
-
- def rdump(self):
- bytecodes = []
- res = []
- for bytecode, ops in self.log_list:
- bytecodes.append(bytecode)
- if ops:
- op = ops.pop(0)
- res.append((op, bytecodes))
- bytecodes = []
- for op in ops:
- res.append((op, []))
-
- #the rest
- res.append((None, bytecodes))
- return res
-
- return TraceObjSpace()
+ def __hash__(self):
+ return hash(self.space)
+Trace = TraceObjSpace
Space = Trace
# ______________________________________________________________________
# End of trace.py
-
-## if __name__ == "__main__":
-
-
-## s = Trace(TrivialObjSpace)
-
-## def a(b):
-## print "x"
-## if b > 2:
-## return b*2
-## else:
-## return b
-
-## print run_function(s, a, 1)
-
-## print ">>>>>>"
-## for line in s.dump():
-## ((opcode, opname, arg, ins_idx), spaceops) = line
-## print ins_idx, opname, spaceops
-## print ">>>>>>"
-## #for line in s.rdump():
-## # print line
-
-## #import dis
-## #dis.dis(a)
Modified: pypy/trunk/src/pypy/tool/pydis.py
==============================================================================
--- pypy/trunk/src/pypy/tool/pydis.py (original)
+++ pypy/trunk/src/pypy/tool/pydis.py Wed Dec 17 17:00:30 2003
@@ -115,6 +115,13 @@
return _trace_function(trace_space, True, fn, *arg, **kwds)
+def trace_function2(space, fn, *arg, **kwds):
+ return _trace_function(Trace(space), False, fn, *arg, **kwds)
+
+def rtrace_function2(space, fn, *arg, **kwds):
+ return _trace_function(Trace(space), True, fn, *arg, **kwds)
+
+
## # Create space
More information about the Pypy-commit
mailing list