* parse.y (parser_nextc): added single line read forward buffer.

* parse.y (parser_yylex): adjust line number for fluent interface.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13858 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2007-11-09 14:33:18 +00:00
parent 6e572060eb
commit 87f538563f
2 changed files with 25 additions and 14 deletions

View File

@ -1,3 +1,9 @@
Fri Nov 9 23:33:16 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* parse.y (parser_nextc): added single line read forward buffer.
* parse.y (parser_yylex): adjust line number for fluent interface.
Fri Nov 9 22:04:21 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Nov 9 22:04:21 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm.h (FRAME_MAGIC_MASK_BITS): bits of FRAME_MAGIC_MASK. * vm.h (FRAME_MAGIC_MASK_BITS): bits of FRAME_MAGIC_MASK.

33
parse.y
View File

@ -224,6 +224,7 @@ struct parser_params {
int parser_toksiz; int parser_toksiz;
VALUE parser_lex_input; VALUE parser_lex_input;
VALUE parser_lex_lastline; VALUE parser_lex_lastline;
VALUE parser_lex_nextline;
const char *parser_lex_pbeg; const char *parser_lex_pbeg;
const char *parser_lex_p; const char *parser_lex_p;
const char *parser_lex_pend; const char *parser_lex_pend;
@ -304,6 +305,7 @@ static int parser_yyerror(struct parser_params*, const char*);
#define toksiz (parser->parser_toksiz) #define toksiz (parser->parser_toksiz)
#define lex_input (parser->parser_lex_input) #define lex_input (parser->parser_lex_input)
#define lex_lastline (parser->parser_lex_lastline) #define lex_lastline (parser->parser_lex_lastline)
#define lex_nextline (parser->parser_lex_nextline)
#define lex_pbeg (parser->parser_lex_pbeg) #define lex_pbeg (parser->parser_lex_pbeg)
#define lex_p (parser->parser_lex_p) #define lex_p (parser->parser_lex_p)
#define lex_pend (parser->parser_lex_pend) #define lex_pend (parser->parser_lex_pend)
@ -4852,15 +4854,19 @@ parser_nextc(struct parser_params *parser)
int c; int c;
if (lex_p == lex_pend) { if (lex_p == lex_pend) {
if (parser->eofp) VALUE v = lex_nextline;
return -1; lex_nextline = 0;
if (lex_input) { if (!v) {
VALUE v = lex_getline(parser); if (parser->eofp)
return -1;
if (NIL_P(v)) { if (!lex_input || NIL_P(v = lex_getline(parser))) {
parser->eofp = Qtrue; parser->eofp = Qtrue;
return -1; lex_lastline = 0;
} return -1;
}
}
{
#ifdef RIPPER #ifdef RIPPER
if (parser->tokp < lex_pend) { if (parser->tokp < lex_pend) {
if (NIL_P(parser->delayed)) { if (NIL_P(parser->delayed)) {
@ -4889,10 +4895,6 @@ parser_nextc(struct parser_params *parser)
#endif #endif
lex_lastline = v; lex_lastline = v;
} }
else {
lex_lastline = 0;
return -1;
}
} }
c = (unsigned char)*lex_p++; c = (unsigned char)*lex_p++;
if (c == '\r' && lex_p < lex_pend && *lex_p == '\n') { if (c == '\r' && lex_p < lex_pend && *lex_p == '\n') {
@ -5013,7 +5015,7 @@ parser_tokadd_utf8(struct parser_params *parser, int *hasmb,
tokadd(codepoint); tokadd(codepoint);
} }
} while(string_literal && (peek(' ') || peek('\t'))); } while (string_literal && (peek(' ') || peek('\t')));
if (!peek('}')) { if (!peek('}')) {
yyerror("unterminated Unicode escape"); yyerror("unterminated Unicode escape");
@ -6061,7 +6063,9 @@ parser_yylex(struct parser_params *parser)
} }
} }
default: default:
pushback(c); lex_nextline = lex_lastline;
lex_p = lex_pend;
--ruby_sourceline;
goto normal_newline; goto normal_newline;
} }
} }
@ -9088,6 +9092,7 @@ parser_mark(void *ptr)
rb_gc_mark((VALUE)p->parser_lex_strterm); rb_gc_mark((VALUE)p->parser_lex_strterm);
rb_gc_mark(p->parser_lex_input); rb_gc_mark(p->parser_lex_input);
rb_gc_mark(p->parser_lex_lastline); rb_gc_mark(p->parser_lex_lastline);
rb_gc_mark(p->parser_lex_nextline);
#ifndef RIPPER #ifndef RIPPER
rb_gc_mark((VALUE)p->parser_eval_tree_begin) ; rb_gc_mark((VALUE)p->parser_eval_tree_begin) ;
rb_gc_mark((VALUE)p->parser_eval_tree) ; rb_gc_mark((VALUE)p->parser_eval_tree) ;