~ubuntu-branches/ubuntu/karmic/pypy/karmic

« back to all changes in this revision

Viewing changes to pypy/interpreter/generator.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2007-04-13 09:33:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070413093309-yoojh4jcoocu2krz
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from pypy.interpreter.error import OperationError
 
2
from pypy.interpreter.baseobjspace import Wrappable
 
3
 
 
4
 
 
5
class GeneratorIterator(Wrappable):
 
6
    "An iterator created by a generator."
 
7
    
 
8
    def __init__(self, frame):
 
9
        self.space = frame.space
 
10
        self.frame = frame
 
11
        self.running = False
 
12
 
 
13
    def descr__reduce__(self, space):
 
14
        from pypy.interpreter.mixedmodule import MixedModule
 
15
        w_mod    = space.getbuiltinmodule('_pickle_support')
 
16
        mod      = space.interp_w(MixedModule, w_mod)
 
17
        new_inst = mod.get('generator_new')
 
18
        w        = space.wrap
 
19
 
 
20
        tup = [
 
21
            w(self.frame),
 
22
            w(self.running),
 
23
            ]
 
24
 
 
25
        return space.newtuple([new_inst, space.newtuple(tup)])
 
26
 
 
27
    def descr__iter__(self):
 
28
        """x.__iter__() <==> iter(x)"""
 
29
        return self.space.wrap(self)
 
30
 
 
31
    def descr_next(self):
 
32
        """x.next() -> the next value, or raise StopIteration"""
 
33
        space = self.space
 
34
        if self.running:
 
35
            raise OperationError(space.w_ValueError,
 
36
                                 space.wrap('generator already executing'))
 
37
        if self.frame.frame_finished_execution:
 
38
            raise OperationError(space.w_StopIteration, space.w_None) 
 
39
        self.running = True
 
40
        try:
 
41
            try:
 
42
                w_result = self.frame.execute_frame()
 
43
            except OperationError:
 
44
                # errors finish a frame
 
45
                self.frame.frame_finished_execution = True
 
46
                raise
 
47
            # if the frame is now marked as finished, it was RETURNed from
 
48
            if self.frame.frame_finished_execution:
 
49
                raise OperationError(space.w_StopIteration, space.w_None) 
 
50
            else:
 
51
                return w_result     # YIELDed
 
52
        finally:
 
53
            self.frame.f_back = None
 
54
            self.running = False