2
from pypy.objspace.proxy import patch_space_in_place
3
from pypy.objspace.std.objspace import StdObjSpace, W_Object
4
from pypy.interpreter.error import OperationError
5
from pypy.interpreter import baseobjspace
7
DUMP_FILE_NAME = 'pypy-space-dump'
13
def __init__(self, space):
15
self.dumpspace_reprs = {}
19
self.dumpspace_reprs.update({
21
space.w_False: 'False',
25
self.dump_fd = os.open(DUMP_FILE_NAME,
26
os.O_WRONLY|os.O_CREAT|os.O_TRUNC,
31
os.close(self.dump_fd)
33
self.dumpspace_reprs.clear()
35
def dump_get_repr(self, w_obj):
37
return self.dumpspace_reprs[w_obj]
39
saved_fd = self.dump_fd
43
if isinstance(w_obj, W_Object):
44
w_type = space.type(w_obj)
47
if w_type is space.w_int:
48
n = space.int_w(w_obj)
50
elif w_type is space.w_str:
51
s = space.str_w(w_obj)
52
digit2hex = '0123456789abcdef'
67
lst.append(digit2hex[ord(c) >> 4])
68
lst.append(digit2hex[ord(c) & 0xf])
71
elif w_type is space.w_float:
72
n = space.float_w(w_obj)
75
s = '%s at 0x%x' % (w_obj, id(w_obj))
76
self.dumpspace_reprs[w_obj] = s
78
self.dump_fd = saved_fd
81
def dump_enter(self, opname, args_w):
83
text = '\t'.join([self.dump_get_repr(w_arg) for w_arg in args_w])
84
os.write(self.dump_fd, '%s CALL %s\n' % (opname, text))
86
def dump_returned_wrapped(self, opname, w_obj):
88
s = self.dump_get_repr(w_obj)
89
os.write(self.dump_fd, '%s RETURN %s\n' % (opname, s))
91
def dump_returned(self, opname):
93
os.write(self.dump_fd, '%s RETURN\n' % (opname,))
95
def dump_raised(self, opname, e):
97
if isinstance(e, OperationError):
98
s = e.errorstr(self.space)
101
os.write(self.dump_fd, '%s RAISE %s\n' % (opname, s))
104
# for now, always make up a wrapped StdObjSpace
105
class DumpSpace(StdObjSpace):
107
def __init__(self, *args, **kwds):
108
self.dumper = Dumper(self)
109
StdObjSpace.__init__(self, *args, **kwds)
110
patch_space_in_place(self, 'dump', proxymaker)
113
# remove strange things from the caches of self.dumper
116
return StdObjSpace._freeze_(self)
119
StdObjSpace.startup(self)
124
StdObjSpace.finish(self)
127
w_res = StdObjSpace.wrap(self, x)
128
self.dumper.dump_returned_wrapped(' wrap', w_res)
130
wrap._annspecialcase_ = "specialize:wrap"
135
# __________________________________________________________________________
138
op_returning_wrapped = {}
142
# ---- irregular operations ----
164
op_returning_wrapped.update({
174
for opname, _, arity, _ in baseobjspace.ObjSpace.MethodTable:
175
nb_args.setdefault(opname, arity)
176
op_returning_wrapped[opname] = True
177
for opname in baseobjspace.ObjSpace.IrregularOpTable:
178
assert opname in nb_args, "missing %r" % opname
183
# __________________________________________________________________________
185
def proxymaker(space, opname, parentfn):
188
returns_wrapped = opname in op_returning_wrapped
189
aligned_opname = '%15s' % opname
191
def proxy(*args, **kwds):
192
dumper = space.dumper
193
args_w = list(args[:n])
194
dumper.dump_enter(aligned_opname, args_w)
196
res = parentfn(*args, **kwds)
198
dumper.dump_raised(aligned_opname, e)
202
dumper.dump_returned_wrapped(aligned_opname, res)
204
dumper.dump_returned(aligned_opname)
206
proxy.func_name = 'proxy_%s' % (opname,)