Skip to content

Commit

Permalink
Some parser state cleanup.
Browse files Browse the repository at this point in the history
Starting with 1.9, MRI added a parser state struct like we had
in Melbourne and accesses the previous global variables through
macros. We had macros for some of the variables but the access
was ad hoc and inconsistent. This cleanup attempts to make the
access consistent. However, there are some variables like 'enc'
that are still accessed via directly parser_state->.
  • Loading branch information
Brian Ford committed Apr 13, 2011
1 parent a68bb5e commit e81170d
Show file tree
Hide file tree
Showing 5 changed files with 206 additions and 208 deletions.
116 changes: 53 additions & 63 deletions lib/ext/melbourne/grammar18.y
Expand Up @@ -31,8 +31,6 @@

namespace melbourne {

rb_parser_state *alloc_parser_state();

namespace grammar18 {

#ifndef isnumber
Expand Down Expand Up @@ -235,14 +233,14 @@ static int _debug_print(const char *fmt, ...) {
#define rb_warn _debug_print
#define rb_warning _debug_print

void push_start_line(rb_parser_state* st, int line, const char* which) {
st->start_lines->push_back(StartPosition(line, which));
void push_start_line(rb_parser_state* parser_state, int line, const char* which) {
start_lines->push_back(StartPosition(line, which));
}

#define PUSH_LINE(which) push_start_line((rb_parser_state*)parser_state, ruby_sourceline, which)

void pop_start_line(rb_parser_state* st) {
st->start_lines->pop_back();
void pop_start_line(rb_parser_state* parser_state) {
start_lines->pop_back();
}

#define POP_LINE() pop_start_line((rb_parser_state*)parser_state)
Expand Down Expand Up @@ -1306,11 +1304,11 @@ arg : lhs '=' arg
in_defined = 0;
$$ = NEW_DEFINED($4);
}
| arg '?' {vps->ternary_colon++;} arg ':' arg
| arg '?' {ternary_colon++;} arg ':' arg
{
$$ = NEW_IF(cond($1, vps), $4, $6);
fixpos($$, $1);
vps->ternary_colon--;
ternary_colon--;
}
| primary
{
Expand Down Expand Up @@ -2700,7 +2698,7 @@ yycompile(rb_parser_state *parser_state, char *f, int line)
/* Setup an initial empty scope. */
heredoc_end = 0;
lex_strterm = 0;
parser_state->end_seen = 0;
end_seen = 0;
ruby_sourcefile = f;
command_start = TRUE;
n = yyparse(parser_state);
Expand All @@ -2726,41 +2724,41 @@ lex_get_str(rb_parser_state *parser_state)
const char *beg, *end, *pend;
int sz;

str = bdata(parser_state->lex_string);
str = bdata(lex_string);
beg = str;

if (parser_state->lex_str_used) {
if (blength(parser_state->lex_string) == parser_state->lex_str_used) {
if (lex_str_used) {
if (blength(lex_string) == lex_str_used) {
return false;
}

beg += parser_state->lex_str_used;
beg += lex_str_used;
}

pend = str + blength(parser_state->lex_string);
pend = str + blength(lex_string);
end = beg;

while(end < pend) {
if(*end++ == '\n') break;
}

sz = end - beg;
bcatblk(parser_state->line_buffer, beg, sz);
parser_state->lex_str_used += sz;
bcatblk(line_buffer, beg, sz);
lex_str_used += sz;

return TRUE;
}

static bool
lex_getline(rb_parser_state *parser_state)
{
if(!parser_state->line_buffer) {
parser_state->line_buffer = cstr2bstr("");
if(!line_buffer) {
line_buffer = cstr2bstr("");
} else {
btrunc(parser_state->line_buffer, 0);
btrunc(line_buffer, 0);
}

return parser_state->lex_gets(parser_state);
return lex_gets(parser_state);
}

VALUE process_parse_tree(rb_parser_state*, VALUE, NODE*, QUID*);
Expand All @@ -2769,24 +2767,20 @@ VALUE
string_to_ast(VALUE ptp, const char *f, bstring s, int line)
{
int n;
rb_parser_state *parser_state;
VALUE ret;
parser_state = alloc_parser_state();
parser_state->lex_string = s;
parser_state->lex_gets = lex_get_str;
lex_pbeg = 0;
lex_p = 0;
lex_pend = 0;
parser_state->error = Qfalse;
parser_state->processor = ptp;
rb_parser_state *parser_state = parser_alloc_state();

lex_string = s;
lex_gets = lex_get_str;
processor = ptp;
ruby_sourceline = line - 1;
compile_for_eval = 1;

n = yycompile(parser_state, (char*)f, line);

if(parser_state->error == Qfalse) {
for(std::vector<bstring>::iterator i = parser_state->magic_comments->begin();
i != parser_state->magic_comments->end();
if(!parse_error) {
for(std::vector<bstring>::iterator i = magic_comments->begin();
i != magic_comments->end();
i++) {
rb_funcall(ptp, rb_intern("add_magic_comment"), 1,
rb_str_new((const char*)(*i)->data, (*i)->slen));
Expand All @@ -2801,21 +2795,21 @@ string_to_ast(VALUE ptp, const char *f, bstring s, int line)
}

static bool parse_io_gets(rb_parser_state *parser_state) {
if(feof(parser_state->lex_io)) {
if(feof(lex_io)) {
return false;
}

while(TRUE) {
char *ptr, buf[1024];
int read;

ptr = fgets(buf, sizeof(buf), parser_state->lex_io);
ptr = fgets(buf, sizeof(buf), lex_io);
if(!ptr) {
return false;
}

read = strlen(ptr);
bcatblk(parser_state->line_buffer, ptr, read);
bcatblk(line_buffer, ptr, read);

/* check whether we read a full line */
if(!(read == (sizeof(buf) - 1) && ptr[read] != '\n')) {
Expand All @@ -2831,30 +2825,26 @@ file_to_ast(VALUE ptp, const char *f, FILE *file, int start)
{
int n;
VALUE ret;
rb_parser_state *parser_state;
parser_state = alloc_parser_state();
parser_state->lex_io = file;
parser_state->lex_gets = parse_io_gets;
lex_pbeg = 0;
lex_p = 0;
lex_pend = 0;
parser_state->error = Qfalse;
parser_state->processor = ptp;
rb_parser_state *parser_state = parser_alloc_state();

lex_io = file;
lex_gets = parse_io_gets;
processor = ptp;
ruby_sourceline = start - 1;

n = yycompile(parser_state, (char*)f, start);

if(parser_state->error == Qfalse) {
for(std::vector<bstring>::iterator i = parser_state->magic_comments->begin();
i != parser_state->magic_comments->end();
if(!parse_error) {
for(std::vector<bstring>::iterator i = magic_comments->begin();
i != magic_comments->end();
i++) {
rb_funcall(ptp, rb_intern("add_magic_comment"), 1,
rb_str_new((const char*)(*i)->data, (*i)->slen));
}
ret = process_parse_tree(parser_state, ptp, top_node, NULL);

if (parser_state->end_seen && parser_state->lex_io) {
rb_funcall(ptp, rb_sData, 1, ULONG2NUM(ftell(parser_state->lex_io)));
if (end_seen && lex_io) {
rb_funcall(ptp, rb_sData, 1, ULONG2NUM(ftell(lex_io)));
}
} else {
ret = Qnil;
Expand All @@ -2876,7 +2866,7 @@ ps_nextc(rb_parser_state *parser_state)
bstring v;

if (!lex_getline(parser_state)) return -1;
v = parser_state->line_buffer;
v = line_buffer;

if (heredoc_end > 0) {
ruby_sourceline = heredoc_end;
Expand All @@ -2902,11 +2892,11 @@ ps_nextc(rb_parser_state *parser_state)
if (c == '\r' && lex_p < lex_pend && *(lex_p) == '\n') {
lex_p++;
c = '\n';
parser_state->column = 0;
column = 0;
} else if(c == '\n') {
parser_state->column = 0;
column = 0;
} else {
parser_state->column++;
column++;
}

return c;
Expand Down Expand Up @@ -3297,7 +3287,7 @@ static int tokadd_string(int func, int term, int paren, quark *nest, rb_parser_s
#define NEW_STRTERM(func, term, paren) \
node_newnode(NODE_STRTERM, (VALUE)(func), \
(VALUE)((term) | ((paren) << (CHAR_BIT * 2))), NULL)
#define pslval ((YYSTYPE *)parser_state->lval)
#define pslval ((YYSTYPE *)lval)
static int
parse_string(NODE *quote, rb_parser_state *parser_state)
{
Expand Down Expand Up @@ -3614,7 +3604,7 @@ yylex(void *yylval_v, void *vstate)
YYSTYPE *yylval = (YYSTYPE*)yylval_v;
parser_state = (struct rb_parser_state*)vstate;

parser_state->lval = (void *)yylval;
lval = (void *)yylval;

/*
c = nextc();
Expand Down Expand Up @@ -3661,7 +3651,7 @@ yylex(void *yylval_v, void *vstate)
if(char* str = parse_comment(parser_state)) {
int len = lex_pend - str - 1; // - 1 for the \n
cur_line = blk2bstr(str, len);
parser_state->magic_comments->push_back(cur_line);
magic_comments->push_back(cur_line);
}
lex_p = lex_pend;
/* fall through */
Expand Down Expand Up @@ -3893,7 +3883,7 @@ yylex(void *yylval_v, void *vstate)
ternary:
pushback(c, parser_state);
lex_state = EXPR_BEG;
parser_state->ternary_colon = 1;
ternary_colon = 1;
return '?';
}
else if (ismbchar(c)) {
Expand Down Expand Up @@ -4644,7 +4634,7 @@ yylex(void *yylval_v, void *vstate)

case '_':
if (was_bol() && whole_match_p("__END__", 7, 0, parser_state)) {
parser_state->end_seen = 1;
end_seen = 1;
return -1;
}
newtok(parser_state);
Expand Down Expand Up @@ -4831,7 +4821,7 @@ static void
parser_warning(rb_parser_state *parser_state, NODE *node, const char *mesg)
{
int line = ruby_sourceline;
if(parser_state->emit_warnings) {
if(emit_warnings) {
ruby_sourceline = nd_line(node);
printf("%s:%li: warning: %s\n", ruby_sourcefile, ruby_sourceline, mesg);
ruby_sourceline = line;
Expand Down Expand Up @@ -4866,7 +4856,7 @@ block_append(rb_parser_state *parser_state, NODE *head, NODE *tail)
break;
}

if (parser_state->verbose) {
if (verbose) {
NODE *nd = end->nd_head;
newline:
switch (nd_type(nd)) {
Expand Down Expand Up @@ -5412,7 +5402,7 @@ void_expr0(NODE *node, rb_parser_state *parser_state)
{
const char *useless = NULL;

if (!parser_state->verbose) return;
if (!verbose) return;

again:
if (!node) return;
Expand Down Expand Up @@ -5505,7 +5495,7 @@ void_expr0(NODE *node, rb_parser_state *parser_state)
static void
void_stmts(NODE *node, rb_parser_state *parser_state)
{
if (!parser_state->verbose) return;
if (!verbose) return;
if (!node) return;
if (nd_type(node) != NODE_BLOCK) return;

Expand Down Expand Up @@ -5664,7 +5654,7 @@ cond0(NODE *node, rb_parser_state *parser_state)
if (!e_option_supplied()) {
int b = literal_node(node->nd_beg);
int e = literal_node(node->nd_end);
if ((b == 1 && e == 1) || (b + e >= 2 && parser_state->verbose)) {
if ((b == 1 && e == 1) || (b + e >= 2 && verbose)) {
}
}
break;
Expand Down

0 comments on commit e81170d

Please sign in to comment.