Changeset 377 for pyyaml/trunk


Ignore:
Timestamp:
05/29/11 22:51:30 (3 years ago)
Author:
xi
Message:

Clear cyclic references in the parser and the emitter to avoid extra GC calls.

Location:
pyyaml/trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • pyyaml/trunk/ext/_yaml.pyx

    r366 r377  
    311311        yaml_parser_delete(&self.parser) 
    312312        yaml_event_delete(&self.parsed_event) 
     313 
     314    def dispose(self): 
     315        pass 
    313316 
    314317    cdef object _parser_error(self): 
     
    993996    def __dealloc__(self): 
    994997        yaml_emitter_delete(&self.emitter) 
     998 
     999    def dispose(self): 
     1000        pass 
    9951001 
    9961002    cdef object _emitter_error(self): 
  • pyyaml/trunk/lib/yaml/__init__.py

    r360 r377  
    2222    """ 
    2323    loader = Loader(stream) 
    24     while loader.check_token(): 
    25         yield loader.get_token() 
     24    try: 
     25        while loader.check_token(): 
     26            yield loader.get_token() 
     27    finally: 
     28        loader.dispose() 
    2629 
    2730def parse(stream, Loader=Loader): 
     
    3033    """ 
    3134    loader = Loader(stream) 
    32     while loader.check_event(): 
    33         yield loader.get_event() 
     35    try: 
     36        while loader.check_event(): 
     37            yield loader.get_event() 
     38    finally: 
     39        loader.dispose() 
    3440 
    3541def compose(stream, Loader=Loader): 
     
    3945    """ 
    4046    loader = Loader(stream) 
    41     return loader.get_single_node() 
     47    try: 
     48        return loader.get_single_node() 
     49    finally: 
     50        loader.dispose() 
    4251 
    4352def compose_all(stream, Loader=Loader): 
     
    4756    """ 
    4857    loader = Loader(stream) 
    49     while loader.check_node(): 
    50         yield loader.get_node() 
     58    try: 
     59        while loader.check_node(): 
     60            yield loader.get_node() 
     61    finally: 
     62        loader.dispose() 
    5163 
    5264def load(stream, Loader=Loader): 
     
    5668    """ 
    5769    loader = Loader(stream) 
    58     return loader.get_single_data() 
     70    try: 
     71        return loader.get_single_data() 
     72    finally: 
     73        loader.dispose() 
    5974 
    6075def load_all(stream, Loader=Loader): 
     
    6479    """ 
    6580    loader = Loader(stream) 
    66     while loader.check_data(): 
    67         yield loader.get_data() 
     81    try: 
     82        while loader.check_data(): 
     83            yield loader.get_data() 
     84    finally: 
     85        loader.dispose() 
    6886 
    6987def safe_load(stream): 
     
    97115    dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, 
    98116            allow_unicode=allow_unicode, line_break=line_break) 
    99     for event in events: 
    100         dumper.emit(event) 
     117    try: 
     118        for event in events: 
     119            dumper.emit(event) 
     120    finally: 
     121        dumper.dispose() 
    101122    if getvalue: 
    102123        return getvalue() 
     
    123144            encoding=encoding, version=version, tags=tags, 
    124145            explicit_start=explicit_start, explicit_end=explicit_end) 
    125     dumper.open() 
    126     for node in nodes: 
    127         dumper.serialize(node) 
    128     dumper.close() 
     146    try: 
     147        dumper.open() 
     148        for node in nodes: 
     149            dumper.serialize(node) 
     150        dumper.close() 
     151    finally: 
     152        dumper.dispose() 
    129153    if getvalue: 
    130154        return getvalue() 
     
    161185            encoding=encoding, version=version, tags=tags, 
    162186            explicit_start=explicit_start, explicit_end=explicit_end) 
    163     dumper.open() 
    164     for data in documents: 
    165         dumper.represent(data) 
    166     dumper.close() 
     187    try: 
     188        dumper.open() 
     189        for data in documents: 
     190            dumper.represent(data) 
     191        dumper.close() 
     192    finally: 
     193        dumper.dispose() 
    167194    if getvalue: 
    168195        return getvalue() 
  • pyyaml/trunk/lib/yaml/constructor.py

    r303 r377  
    5959 
    6060    def construct_object(self, node, deep=False): 
     61        if node in self.constructed_objects: 
     62            return self.constructed_objects[node] 
    6163        if deep: 
    6264            old_deep = self.deep_construct 
    6365            self.deep_construct = True 
    64         if node in self.constructed_objects: 
    65             return self.constructed_objects[node] 
    6666        if node in self.recursive_objects: 
    6767            raise ConstructorError(None, None, 
  • pyyaml/trunk/lib/yaml/emitter.py

    r351 r377  
    103103        self.analysis = None 
    104104        self.style = None 
     105 
     106    def dispose(self): 
     107        # Reset the state attributes (to clear self-references) 
     108        self.states = [] 
     109        self.state = None 
    105110 
    106111    def emit(self, event): 
  • pyyaml/trunk/lib/yaml/parser.py

    r302 r377  
    8787        self.state = self.parse_stream_start 
    8888 
     89    def dispose(self): 
     90        # Reset the state attributes (to clear self-references) 
     91        self.states = [] 
     92        self.state = None 
     93 
    8994    def check_event(self, *choices): 
    9095        # Check the type of the next event. 
  • pyyaml/trunk/lib3/yaml/__init__.py

    r360 r377  
    2323    """ 
    2424    loader = Loader(stream) 
    25     while loader.check_token(): 
    26         yield loader.get_token() 
     25    try: 
     26        while loader.check_token(): 
     27            yield loader.get_token() 
     28    finally: 
     29        loader.dispose() 
    2730 
    2831def parse(stream, Loader=Loader): 
     
    3134    """ 
    3235    loader = Loader(stream) 
    33     while loader.check_event(): 
    34         yield loader.get_event() 
     36    try: 
     37        while loader.check_event(): 
     38            yield loader.get_event() 
     39    finally: 
     40        loader.dispose() 
    3541 
    3642def compose(stream, Loader=Loader): 
     
    4046    """ 
    4147    loader = Loader(stream) 
    42     return loader.get_single_node() 
     48    try: 
     49        return loader.get_single_node() 
     50    finally: 
     51        loader.dispose() 
    4352 
    4453def compose_all(stream, Loader=Loader): 
     
    4857    """ 
    4958    loader = Loader(stream) 
    50     while loader.check_node(): 
    51         yield loader.get_node() 
     59    try: 
     60        while loader.check_node(): 
     61            yield loader.get_node() 
     62    finally: 
     63        loader.dispose() 
    5264 
    5365def load(stream, Loader=Loader): 
     
    5769    """ 
    5870    loader = Loader(stream) 
    59     return loader.get_single_data() 
     71    try: 
     72        return loader.get_single_data() 
     73    finally: 
     74        loader.dispose() 
    6075 
    6176def load_all(stream, Loader=Loader): 
     
    6580    """ 
    6681    loader = Loader(stream) 
    67     while loader.check_data(): 
    68         yield loader.get_data() 
     82    try: 
     83        while loader.check_data(): 
     84            yield loader.get_data() 
     85    finally: 
     86        loader.dispose() 
    6987 
    7088def safe_load(stream): 
     
    97115    dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, 
    98116            allow_unicode=allow_unicode, line_break=line_break) 
    99     for event in events: 
    100         dumper.emit(event) 
     117    try: 
     118        for event in events: 
     119            dumper.emit(event) 
     120    finally: 
     121        dumper.dispose() 
    101122    if getvalue: 
    102123        return getvalue() 
     
    122143            encoding=encoding, version=version, tags=tags, 
    123144            explicit_start=explicit_start, explicit_end=explicit_end) 
    124     dumper.open() 
    125     for node in nodes: 
    126         dumper.serialize(node) 
    127     dumper.close() 
     145    try: 
     146        dumper.open() 
     147        for node in nodes: 
     148            dumper.serialize(node) 
     149        dumper.close() 
     150    finally: 
     151        dumper.dispose() 
    128152    if getvalue: 
    129153        return getvalue() 
     
    159183            encoding=encoding, version=version, tags=tags, 
    160184            explicit_start=explicit_start, explicit_end=explicit_end) 
    161     dumper.open() 
    162     for data in documents: 
    163         dumper.represent(data) 
    164     dumper.close() 
     185    try: 
     186        dumper.open() 
     187        for data in documents: 
     188            dumper.represent(data) 
     189        dumper.close() 
     190    finally: 
     191        dumper.dispose() 
    165192    if getvalue: 
    166193        return getvalue() 
  • pyyaml/trunk/lib3/yaml/constructor.py

    r361 r377  
    5252 
    5353    def construct_object(self, node, deep=False): 
     54        if node in self.constructed_objects: 
     55            return self.constructed_objects[node] 
    5456        if deep: 
    5557            old_deep = self.deep_construct 
    5658            self.deep_construct = True 
    57         if node in self.constructed_objects: 
    58             return self.constructed_objects[node] 
    5959        if node in self.recursive_objects: 
    6060            raise ConstructorError(None, None, 
  • pyyaml/trunk/lib3/yaml/emitter.py

    r359 r377  
    103103        self.analysis = None 
    104104        self.style = None 
     105 
     106    def dispose(self): 
     107        # Reset the state attributes (to clear self-references) 
     108        self.states = [] 
     109        self.state = None 
    105110 
    106111    def emit(self, event): 
  • pyyaml/trunk/lib3/yaml/parser.py

    r328 r377  
    8787        self.state = self.parse_stream_start 
    8888 
     89    def dispose(self): 
     90        # Reset the state attributes (to clear self-references) 
     91        self.states = [] 
     92        self.state = None 
     93 
    8994    def check_event(self, *choices): 
    9095        # Check the type of the next event. 
  • pyyaml/trunk/tests/lib/canonical.py

    r330 r377  
    211211        self.events = [] 
    212212        self.parsed = False 
     213 
     214    def dispose(self): 
     215        pass 
    213216 
    214217    # stream: STREAM-START document* STREAM-END 
  • pyyaml/trunk/tests/lib3/canonical.py

    r330 r377  
    212212        self.events = [] 
    213213        self.parsed = False 
     214 
     215    def dispose(self): 
     216        pass 
    214217 
    215218    # stream: STREAM-START document* STREAM-END 
Note: See TracChangeset for help on using the changeset viewer.