Ignore:
Timestamp:
06/30/06 04:07:42 (8 years ago)
Author:
xi
Message:

Trying to make libyaml bindings faster.

File:
1 edited

Legend:

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

    r195 r196  
    1010    return (major, minor, patch) 
    1111 
     12def test_scanner(data): 
     13    cdef yaml_parser_t *parser 
     14    cdef yaml_token_t *token 
     15    cdef int done 
     16    if PyString_CheckExact(data) == 0: 
     17        raise TypeError("string input required") 
     18    parser = yaml_parser_new() 
     19    if parser == NULL: 
     20        raise MemoryError 
     21    yaml_parser_set_input_string(parser, PyString_AS_STRING(data), PyString_GET_SIZE(data)) 
     22    done = 0 
     23    while done == 0: 
     24        token = yaml_parser_get_token(parser) 
     25        if token == NULL: 
     26            raise MemoryError 
     27        if token.type == YAML_STREAM_END_TOKEN: 
     28            done = 1 
     29        yaml_token_delete(token) 
     30    yaml_parser_delete(parser) 
     31 
    1232cdef class Scanner: 
    1333 
     
    1535    cdef int eof 
    1636    cdef object stream 
     37    cdef yaml_token_t *cached_token 
     38    cdef object cached_obj 
    1739 
    1840    def __init__(self, stream): 
    19         cdef char *input 
    20         cdef int size 
    2141        if hasattr(stream, 'read'): 
    2242            stream = stream.read() 
     
    3151        self.eof = 0 
    3252        self.stream = stream 
     53        self.cached_token = NULL 
     54        self.cached_obj = None 
    3355 
    3456    def __dealloc__(self): 
     
    143165    def get_token(self): 
    144166        cdef yaml_token_t *token 
     167        if self.cached_token != NULL: 
     168            yaml_token_delete(yaml_parser_get_token(self.parser)) 
     169            obj = self.cached_obj 
     170            self.cached_token = NULL 
     171            self.cached_obj = None 
     172            return obj 
    145173        if self.eof != 0: 
    146174            return None 
     
    154182    def peek_token(self): 
    155183        cdef yaml_token_t *token 
     184        if self.cached_token != NULL: 
     185            return self.cached_obj 
    156186        if self.eof != 0: 
    157187            return None 
    158188        token = yaml_parser_peek_token(self.parser) 
    159         return self._convert(token) 
     189        obj = self._convert(token) 
     190        if token.type == YAML_STREAM_END_TOKEN: 
     191            self.eof = 1 
     192        self.cached_token = token 
     193        self.cached_obj = obj 
     194        return obj 
    160195 
    161196    def check_token(self, *choices): 
    162197        cdef yaml_token_t *token 
    163         if self.eof != 0: 
     198        if self.cached_token != NULL: 
     199            obj = self.cached_obj 
     200        elif self.eof != 0: 
    164201            return False 
    165         token = yaml_parser_peek_token(self.parser) 
    166         obj = self._convert(token) 
     202        else: 
     203            token = yaml_parser_peek_token(self.parser) 
     204            obj = self._convert(token) 
     205            if token.type == YAML_STREAM_END_TOKEN: 
     206                self.eof = 1 
     207            self.cached_token = token 
     208            self.cached_obj = obj 
    167209        if not choices: 
    168210            return True 
Note: See TracChangeset for help on using the changeset viewer.