ruby-changes:41915
From: nobu <ko1@a...>
Date: Thu, 3 Mar 2016 17:31:16 +0900 (JST)
Subject: [ruby-changes:41915] nobu:r53989 (trunk): parse.y: split nextc
nobu 2016-03-03 17:31:12 +0900 (Thu, 03 Mar 2016) New Revision: 53989 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=53989 Log: parse.y: split nextc * parse.y (parser_nextline, parser_cr): split less frequent paths from parser_nextc. Modified files: trunk/parse.y Index: parse.y =================================================================== --- parse.y (revision 53988) +++ parse.y (revision 53989) @@ -5763,65 +5763,77 @@ parser_str_new(const char *p, long n, rb https://github.com/ruby/ruby/blob/trunk/parse.y#L5763 #define peekc() peekc_n(0) #define peekc_n(n) (lex_p+(n) < lex_pend ? (unsigned char)lex_p[n] : -1) -static inline int -parser_nextc(struct parser_params *parser) +static int +parser_nextline(struct parser_params *parser) { - int c; + VALUE v = lex_nextline; + lex_nextline = 0; + if (!v) { + if (parser->eofp) + return -1; - if (lex_p == lex_pend) { - VALUE v = lex_nextline; - lex_nextline = 0; - if (!v) { - if (parser->eofp) - return -1; - - if (!lex_input || NIL_P(v = lex_getline(parser))) { - parser->eofp = 1; - lex_goto_eol(parser); - return -1; - } - parser->cr_seen = FALSE; + if (!lex_input || NIL_P(v = lex_getline(parser))) { + parser->eofp = 1; + lex_goto_eol(parser); + return -1; } - { + parser->cr_seen = FALSE; + } #ifdef RIPPER - if (parser->tokp < lex_pend) { - if (!has_delayed_token()) { - parser->delayed = rb_str_buf_new(1024); - rb_enc_associate(parser->delayed, current_enc); - rb_str_buf_cat(parser->delayed, - parser->tokp, lex_pend - parser->tokp); - parser->delayed_line = ruby_sourceline; - parser->delayed_col = (int)(parser->tokp - lex_pbeg); - } - else { - rb_str_buf_cat(parser->delayed, - parser->tokp, lex_pend - parser->tokp); - } - } -#endif - if (heredoc_end > 0) { - ruby_sourceline = heredoc_end; - heredoc_end = 0; - } - ruby_sourceline++; - parser->line_count++; - lex_pbeg = lex_p = RSTRING_PTR(v); - lex_pend = lex_p + RSTRING_LEN(v); - ripper_flush(parser); - lex_lastline = v; + if (parser->tokp < lex_pend) { + if (!has_delayed_token()) { + parser->delayed = rb_str_buf_new(1024); + rb_enc_associate(parser->delayed, current_enc); + rb_str_buf_cat(parser->delayed, + parser->tokp, lex_pend - parser->tokp); + parser->delayed_line = ruby_sourceline; + parser->delayed_col = (int)(parser->tokp - lex_pbeg); + } + else { + rb_str_buf_cat(parser->delayed, + parser->tokp, lex_pend - parser->tokp); } } +#endif + if (heredoc_end > 0) { + ruby_sourceline = heredoc_end; + heredoc_end = 0; + } + ruby_sourceline++; + parser->line_count++; + lex_pbeg = lex_p = RSTRING_PTR(v); + lex_pend = lex_p + RSTRING_LEN(v); + ripper_flush(parser); + lex_lastline = v; + return 0; +} + +static int +parser_cr(struct parser_params *parser, int c) +{ + if (peek('\n')) { + lex_p++; + c = '\n'; + } + else if (!parser->cr_seen) { + parser->cr_seen = TRUE; + /* carried over with lex_nextline for nextc() */ + rb_warn0("encountered \\r in middle of line, treated as a mere space"); + } + return c; +} + +static inline int +parser_nextc(struct parser_params *parser) +{ + int c; + + if (UNLIKELY(lex_p == lex_pend)) { + if (parser_nextline(parser)) return -1; + } c = (unsigned char)*lex_p++; - if (c == '\r') { - if (peek('\n')) { - lex_p++; - c = '\n'; - } - else if (!parser->cr_seen) { - parser->cr_seen = TRUE; - /* carried over with lex_nextline for nextc() */ - rb_warn0("encountered \\r in middle of line, treated as a mere space"); - } + if (UNLIKELY(c == '\r')) { + c = parser_cr(parser, c); } return c; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/