@@ -52,6 +52,7 @@ STATIC bool str_strn_equal(const char *str, const char *strn, mp_uint_t len) {
5252 return i == len && * str == 0 ;
5353}
5454
55+ #define MP_LEXER_EOF ((unichar)MP_READER_EOF)
5556#define CUR_CHAR (lex ) ((lex)->chr0)
5657
5758STATIC bool is_end (mp_lexer_t * lex ) {
@@ -145,15 +146,15 @@ STATIC void next_char(mp_lexer_t *lex) {
145146
146147 lex -> chr0 = lex -> chr1 ;
147148 lex -> chr1 = lex -> chr2 ;
148- lex -> chr2 = lex -> stream_next_byte (lex -> stream_data );
149+ lex -> chr2 = lex -> reader . readbyte (lex -> reader . data );
149150
150151 if (lex -> chr0 == '\r' ) {
151152 // CR is a new line, converted to LF
152153 lex -> chr0 = '\n' ;
153154 if (lex -> chr1 == '\n' ) {
154155 // CR LF is a single new line
155156 lex -> chr1 = lex -> chr2 ;
156- lex -> chr2 = lex -> stream_next_byte (lex -> stream_data );
157+ lex -> chr2 = lex -> reader . readbyte (lex -> reader . data );
157158 }
158159 }
159160
@@ -689,21 +690,17 @@ STATIC void mp_lexer_next_token_into(mp_lexer_t *lex, bool first_token) {
689690 }
690691}
691692
692- mp_lexer_t * mp_lexer_new (qstr src_name , void * stream_data , mp_lexer_stream_next_byte_t stream_next_byte , mp_lexer_stream_close_t stream_close ) {
693+ mp_lexer_t * mp_lexer_new (qstr src_name , mp_reader_t reader ) {
693694 mp_lexer_t * lex = m_new_obj_maybe (mp_lexer_t );
694695
695696 // check for memory allocation error
696697 if (lex == NULL ) {
697- if (stream_close ) {
698- stream_close (stream_data );
699- }
698+ reader .close (reader .data );
700699 return NULL ;
701700 }
702701
703702 lex -> source_name = src_name ;
704- lex -> stream_data = stream_data ;
705- lex -> stream_next_byte = stream_next_byte ;
706- lex -> stream_close = stream_close ;
703+ lex -> reader = reader ;
707704 lex -> line = 1 ;
708705 lex -> column = 1 ;
709706 lex -> emit_dent = 0 ;
@@ -724,9 +721,9 @@ mp_lexer_t *mp_lexer_new(qstr src_name, void *stream_data, mp_lexer_stream_next_
724721 lex -> indent_level [0 ] = 0 ;
725722
726723 // preload characters
727- lex -> chr0 = stream_next_byte ( stream_data );
728- lex -> chr1 = stream_next_byte ( stream_data );
729- lex -> chr2 = stream_next_byte ( stream_data );
724+ lex -> chr0 = reader . readbyte ( reader . data );
725+ lex -> chr1 = reader . readbyte ( reader . data );
726+ lex -> chr2 = reader . readbyte ( reader . data );
730727
731728 // if input stream is 0, 1 or 2 characters long and doesn't end in a newline, then insert a newline at the end
732729 if (lex -> chr0 == MP_LEXER_EOF ) {
@@ -756,7 +753,7 @@ mp_lexer_t *mp_lexer_new_from_str_len(qstr src_name, const char *str, mp_uint_t
756753 if (!mp_reader_new_mem (& reader , (const byte * )str , len , free_len )) {
757754 return NULL ;
758755 }
759- return mp_lexer_new (src_name , reader . data , ( mp_lexer_stream_next_byte_t ) reader . readbyte , ( mp_lexer_stream_close_t ) reader . close );
756+ return mp_lexer_new (src_name , reader );
760757}
761758
762759#if MICROPY_READER_POSIX || MICROPY_READER_FATFS
@@ -767,7 +764,7 @@ mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
767764 if (ret != 0 ) {
768765 return NULL ;
769766 }
770- return mp_lexer_new (qstr_from_str (filename ), reader . data , ( mp_lexer_stream_next_byte_t ) reader . readbyte , ( mp_lexer_stream_close_t ) reader . close );
767+ return mp_lexer_new (qstr_from_str (filename ), reader );
771768}
772769
773770#if MICROPY_HELPER_LEXER_UNIX
@@ -778,7 +775,7 @@ mp_lexer_t *mp_lexer_new_from_fd(qstr filename, int fd, bool close_fd) {
778775 if (ret != 0 ) {
779776 return NULL ;
780777 }
781- return mp_lexer_new (filename , reader . data , ( mp_lexer_stream_next_byte_t ) reader . readbyte , ( mp_lexer_stream_close_t ) reader . close );
778+ return mp_lexer_new (filename , reader );
782779}
783780
784781#endif
@@ -787,9 +784,7 @@ mp_lexer_t *mp_lexer_new_from_fd(qstr filename, int fd, bool close_fd) {
787784
788785void mp_lexer_free (mp_lexer_t * lex ) {
789786 if (lex ) {
790- if (lex -> stream_close ) {
791- lex -> stream_close (lex -> stream_data );
792- }
787+ lex -> reader .close (lex -> reader .data );
793788 vstr_clear (& lex -> vstr );
794789 m_del (uint16_t , lex -> indent_level , lex -> alloc_indent_level );
795790 m_del_obj (mp_lexer_t , lex );
0 commit comments