Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r47241:d462a721df1b Date: 2011-09-12 22:22 +0200 http://bitbucket.org/pypy/pypy/changeset/d462a721df1b/
Log: Tighten the checks. 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 @@ -43,16 +43,27 @@ raise getmemoryerror(self.space) def switch(self, w_to): + sthread = self.sthread + if sthread is None: + start_state.clear() + raise geterror(self.space, "continulet not initialized yet") + if sthread.is_empty_handle(self.h): + start_state.clear() + raise geterror(self.space, "continulet already finished") to = self.space.interp_w(W_Continulet, w_to, can_be_None=True) if to is not None: - if to.sthread is None: + if to.sthread is not sthread: start_state.clear() - raise geterror(self.space, "continulet not initialized yet") + if to.sthread is None: + msg = "continulet not initialized yet" + else: + msg = "cross-thread double switch" + raise geterror(self.space, msg) if self is to: # double-switch to myself: no-op return get_result() - if self.sthread is None: - start_state.clear() - raise geterror(self.space, "continulet not initialized yet") + if sthread.is_empty_handle(to.h): + start_state.clear() + raise geterror(self.space, "continulet already finished") ec = self.check_sthread() # start_state.origin = self @@ -63,14 +74,8 @@ # double switch: the final destination is to.h start_state.destination = to # - h = start_state.destination.h - sthread = self.sthread - if sthread.is_empty_handle(h): - start_state.clear() - raise geterror(self.space, "continulet already finished") - # try: - do_switch(sthread, h) + do_switch(sthread, start_state.destination.h) except MemoryError: start_state.clear() raise getmemoryerror(self.space) 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 @@ -643,6 +643,16 @@ assert res == "done" main() + def test_bug_finish_with_already_finished_stacklet(self): + from _continuation import continulet, error + # make an already-finished continulet + c1 = continulet(lambda x: x) + c1.switch() + # make another continulet + c2 = continulet(lambda x: x) + # this switch is forbidden, because it causes a crash when c2 finishes + raises(error, c1.switch, to=c2) + def test_various_depths(self): skip("may fail on top of CPython") # run it from test_translated, but not while being actually translated _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit