[pypy-commit] pypy continulet-no-frame-loop: temporary checkin with some debugging stuff + a new logic to avoid building cycles of frames
antocuni
pypy.commits at gmail.com
Tue Nov 14 20:14:16 EST 2017
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: continulet-no-frame-loop
Changeset: r93028:f7a1a6eb6908
Date: 2017-11-14 11:53 +0100
http://bitbucket.org/pypy/pypy/changeset/f7a1a6eb6908/
Log: temporary checkin with some debugging stuff + a new logic to avoid
building cycles of frames
diff --git a/pypy/module/_continuation/interp_continuation.py b/pypy/module/_continuation/interp_continuation.py
--- a/pypy/module/_continuation/interp_continuation.py
+++ b/pypy/module/_continuation/interp_continuation.py
@@ -41,13 +41,16 @@
bottomframe.locals_cells_stack_w[3] = w_kwds
bottomframe.last_exception = get_cleared_operation_error(space)
self.bottomframe = bottomframe
+ self.topframe = sthread.ec.topframeref # XXX?
#
global_state.origin = self
self.sthread = sthread
+ pstack(self, 'descr_init')
h = sthread.new(new_stacklet_callback)
post_switch(sthread, h)
def switch(self, w_to):
+ #import pdb;pdb.set_trace()
sthread = self.sthread
to = self.space.interp_w(W_Continulet, w_to, can_be_None=True)
if to is not None and to.sthread is None:
@@ -76,9 +79,11 @@
global_state.origin = self
if to is None:
# simple switch: going to self.h
+ #print 'simple switch'
global_state.destination = self
else:
# double switch: the final destination is to.h
+ #print 'double switch'
global_state.destination = to
#
h = sthread.switch(global_state.destination.h)
@@ -217,6 +222,23 @@
global_state.clear()
+def pstack(cont, message=''):
+ return
+ if message:
+ print message
+ if isinstance(cont, jit.DirectJitVRef):
+ f = cont()
+ else:
+ f = cont.bottomframe
+ i = 0
+ while f:
+ print ' ', f.pycode.co_name
+ f = f.f_backref()
+ i += 1
+ if i == 10:
+ break
+ print
+
def new_stacklet_callback(h, arg):
self = global_state.origin
self.h = h
@@ -225,6 +247,7 @@
frame = self.bottomframe
w_result = frame.execute_frame()
except Exception as e:
+ #import pdb;pdb.xpm()
global_state.propagate_exception = e
else:
global_state.w_value = w_result
@@ -236,15 +259,32 @@
def post_switch(sthread, h):
origin = global_state.origin
self = global_state.destination
+ #import pdb;pdb.set_trace()
global_state.origin = None
global_state.destination = None
self.h, origin.h = origin.h, h
#
current = sthread.ec.topframeref
- sthread.ec.topframeref = self.bottomframe.f_backref
- self.bottomframe.f_backref = origin.bottomframe.f_backref
- origin.bottomframe.f_backref = current
+ print '==== SWITCH ===='
+ pstack(sthread.ec.topframeref, 'sthread.ec.topframeref')
+ pstack(self, 'self')
+
+ # ORGINAL
+ ## sthread.ec.topframeref = self.bottomframe.f_backref
+ ## self.bottomframe.f_backref = origin.bottomframe.f_backref
+ ## origin.bottomframe.f_backref = current
+
+ # antocuni
+ sthread.ec.topframeref = self.topframe
+ self.topframe = origin.topframe
+ origin.topframe = current
+
#
+ print 'swap'
+ pstack(sthread.ec.topframeref, 'sthread.ec.topframeref')
+ pstack(self, 'self')
+ print '==== END SWITCH ===='
+ print
return get_result()
def get_result():
diff --git a/pypy/module/_continuation/test/test_stacklet.py b/pypy/module/_continuation/test/test_stacklet.py
--- a/pypy/module/_continuation/test/test_stacklet.py
+++ b/pypy/module/_continuation/test/test_stacklet.py
@@ -336,6 +336,47 @@
assert res == 2002
assert seen == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
+ def test_xxx(self):
+ import sys
+ from _continuation import continulet
+ #
+ def stack(f=None):
+ """
+ get the call-stack of the caller or the specified frame
+ """
+ if f is None:
+ f = sys._getframe(1)
+ res = []
+ seen = set()
+ while f:
+ if f in seen:
+ # frame loop
+ res.append('...')
+ break
+ seen.add(f)
+ res.append(f.f_code.co_name)
+ f = f.f_back
+ print res
+ return res
+
+ def bar(c):
+ f = sys._getframe(0)
+ print 'bar 1'
+ c.switch(f)
+ print 'bar 2'
+ def foo(c):
+ bar(c)
+
+ print
+ c = continulet(foo)
+ print 'test 1'
+ f = c.switch()
+ print 'test 2'
+ xxx = c.switch()
+ print 'xxx', xxx
+ #stack()
+ #stack(f)
+
def test_f_back(self):
import sys
from _continuation import continulet
More information about the pypy-commit
mailing list