Author: Jeremy Thurgood <fir...@gmail.com> Branch: remove-del-from-generatoriterator Changeset: r68717:050108051e15 Date: 2014-01-17 15:45 +0200 http://bitbucket.org/pypy/pypy/changeset/050108051e15/
Log: move GeneratorIterator.__del__ to GeneratorIteratorWithDel subclass, used for code with the CO_YIELD_INSIDE_TRY flag diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py --- a/pypy/interpreter/generator.py +++ b/pypy/interpreter/generator.py @@ -155,20 +155,6 @@ code_name = self.pycode.co_name return space.wrap(code_name) - def __del__(self): - # Only bother enqueuing self to raise an exception if the frame is - # still not finished and finally or except blocks are present. - self.clear_all_weakrefs() - if self.frame is not None: - block = self.frame.lastblock - while block is not None: - if not isinstance(block, LoopBlock): - self.enqueue_for_destruction(self.space, - GeneratorIterator.descr_close, - "interrupting generator of ") - break - block = block.previous - # Results can be either an RPython list of W_Root, or it can be an # app-level W_ListObject, which also has an append() method, that's why we # generate 2 versions of the function and 2 jit drivers. @@ -211,3 +197,20 @@ return unpack_into unpack_into = _create_unpack_into() unpack_into_w = _create_unpack_into() + + +class GeneratorIteratorWithDel(GeneratorIterator): + + def __del__(self): + # Only bother enqueuing self to raise an exception if the frame is + # still not finished and finally or except blocks are present. + self.clear_all_weakrefs() + if self.frame is not None: + block = self.frame.lastblock + while block is not None: + if not isinstance(block, LoopBlock): + self.enqueue_for_destruction(self.space, + GeneratorIterator.descr_close, + "interrupting generator of ") + break + block = block.previous diff --git a/pypy/interpreter/pycode.py b/pypy/interpreter/pycode.py --- a/pypy/interpreter/pycode.py +++ b/pypy/interpreter/pycode.py @@ -12,7 +12,7 @@ from pypy.interpreter.gateway import unwrap_spec from pypy.interpreter.astcompiler.consts import ( CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS, CO_NESTED, - CO_GENERATOR, CO_KILL_DOCSTRING) + CO_GENERATOR, CO_KILL_DOCSTRING, CO_YIELD_INSIDE_TRY) from pypy.tool.stdlib_opcode import opcodedesc, HAVE_ARGUMENT from rpython.rlib.rarithmetic import intmask from rpython.rlib.objectmodel import compute_hash diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py --- a/pypy/interpreter/pyframe.py +++ b/pypy/interpreter/pyframe.py @@ -167,8 +167,12 @@ def run(self): """Start this frame's execution.""" if self.getcode().co_flags & pycode.CO_GENERATOR: - from pypy.interpreter.generator import GeneratorIterator - return self.space.wrap(GeneratorIterator(self)) + if pycode.CO_YIELD_INSIDE_TRY: + from pypy.interpreter.generator import GeneratorIteratorWithDel + return self.space.wrap(GeneratorIteratorWithDel(self)) + else: + from pypy.interpreter.generator import GeneratorIterator + return self.space.wrap(GeneratorIterator(self)) else: return self.execute_frame() diff --git a/pypy/module/_pickle_support/maker.py b/pypy/module/_pickle_support/maker.py --- a/pypy/module/_pickle_support/maker.py +++ b/pypy/module/_pickle_support/maker.py @@ -5,7 +5,7 @@ from pypy.interpreter.module import Module from pypy.interpreter.pyframe import PyFrame from pypy.interpreter.pytraceback import PyTraceback -from pypy.interpreter.generator import GeneratorIterator +from pypy.interpreter.generator import GeneratorIteratorWithDel from rpython.rlib.objectmodel import instantiate from pypy.interpreter.gateway import unwrap_spec from pypy.objspace.std.iterobject import W_SeqIterObject, W_ReverseSeqIterObject @@ -60,7 +60,7 @@ return space.wrap(tb) def generator_new(space): - new_generator = instantiate(GeneratorIterator) + new_generator = instantiate(GeneratorIteratorWithDel) return space.wrap(new_generator) @unwrap_spec(current=int, remaining=int, step=int) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit