Commit 5815ac4f authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #1667 from h2so5/backtrace-lineno

more accurate backtrace lineno
parents aa08158f 36e09250
...@@ -109,7 +109,7 @@ struct mrb_parser_state { ...@@ -109,7 +109,7 @@ struct mrb_parser_state {
#endif #endif
mrbc_context *cxt; mrbc_context *cxt;
char const *filename; char const *filename;
int lineno; int lineno, beg_lineno;
int column; int column;
enum mrb_lex_state_enum lstate; enum mrb_lex_state_enum lstate;
......
...@@ -62,6 +62,9 @@ typedef unsigned int stack_type; ...@@ -62,6 +62,9 @@ typedef unsigned int stack_type;
#define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack) #define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack)
#define CMDARG_P() BITSTACK_SET_P(p->cmdarg_stack) #define CMDARG_P() BITSTACK_SET_P(p->cmdarg_stack)
#define SET_BEG_LINENO(n) (p->beg_lineno = n)
#define CLEAR_BEG_LINENO() (p->beg_lineno = 0)
#define sym(x) ((mrb_sym)(intptr_t)(x)) #define sym(x) ((mrb_sym)(intptr_t)(x))
#define nsym(x) ((node*)(intptr_t)(x)) #define nsym(x) ((node*)(intptr_t)(x))
...@@ -120,7 +123,7 @@ cons_gen(parser_state *p, node *car, node *cdr) ...@@ -120,7 +123,7 @@ cons_gen(parser_state *p, node *car, node *cdr)
c->car = car; c->car = car;
c->cdr = cdr; c->cdr = cdr;
c->lineno = p->lineno; c->lineno = p->beg_lineno ? p->beg_lineno : p->lineno;
c->filename_index = p->current_filename_index; c->filename_index = p->current_filename_index;
return c; return c;
} }
...@@ -2150,7 +2153,11 @@ primary : literal ...@@ -2150,7 +2153,11 @@ primary : literal
{ {
$$ = new_for(p, $2, $5, $8); $$ = new_for(p, $2, $5, $8);
} }
| keyword_class cpath superclass | keyword_class
{
$<num>$ = p->lineno
}
cpath superclass
{ {
if (p->in_def || p->in_single) if (p->in_def || p->in_single)
yyerror(p, "class definition in method body"); yyerror(p, "class definition in method body");
...@@ -2159,10 +2166,16 @@ primary : literal ...@@ -2159,10 +2166,16 @@ primary : literal
bodystmt bodystmt
keyword_end keyword_end
{ {
$$ = new_class(p, $2, $3, $5); SET_BEG_LINENO($<num>2);
local_resume(p, $<nd>4); $$ = new_class(p, $3, $4, $6);
CLEAR_BEG_LINENO();
local_resume(p, $<nd>5);
}
| keyword_class
{
$<num>$ = p->lineno
} }
| keyword_class tLSHFT expr tLSHFT expr
{ {
$<num>$ = p->in_def; $<num>$ = p->in_def;
p->in_def = 0; p->in_def = 0;
...@@ -2175,12 +2188,18 @@ primary : literal ...@@ -2175,12 +2188,18 @@ primary : literal
bodystmt bodystmt
keyword_end keyword_end
{ {
$$ = new_sclass(p, $3, $7); SET_BEG_LINENO($<num>2);
local_resume(p, $<nd>6->car); $$ = new_sclass(p, $4, $8);
p->in_def = $<num>4; CLEAR_BEG_LINENO();
p->in_single = (int)(intptr_t)$<nd>6->cdr; local_resume(p, $<nd>7->car);
p->in_def = $<num>5;
p->in_single = (int)(intptr_t)$<nd>7->cdr;
}
| keyword_module
{
$<num>$ = p->lineno
} }
| keyword_module cpath cpath
{ {
if (p->in_def || p->in_single) if (p->in_def || p->in_single)
yyerror(p, "module definition in method body"); yyerror(p, "module definition in method body");
...@@ -2189,8 +2208,10 @@ primary : literal ...@@ -2189,8 +2208,10 @@ primary : literal
bodystmt bodystmt
keyword_end keyword_end
{ {
$$ = new_module(p, $2, $4); SET_BEG_LINENO($<num>2);
local_resume(p, $<nd>3); $$ = new_module(p, $3, $5);
CLEAR_BEG_LINENO();
local_resume(p, $<nd>4);
} }
| keyword_def fname | keyword_def fname
{ {
...@@ -2543,21 +2564,27 @@ method_call : operation paren_args ...@@ -2543,21 +2564,27 @@ method_call : operation paren_args
brace_block : '{' brace_block : '{'
{ {
local_nest(p); local_nest(p);
$<num>$ = p->lineno;
} }
opt_block_param opt_block_param
compstmt '}' compstmt '}'
{ {
SET_BEG_LINENO($<num>2);
$$ = new_block(p,$3,$4); $$ = new_block(p,$3,$4);
CLEAR_BEG_LINENO();
local_unnest(p); local_unnest(p);
} }
| keyword_do | keyword_do
{ {
local_nest(p); local_nest(p);
$<num>$ = p->lineno;
} }
opt_block_param opt_block_param
compstmt keyword_end compstmt keyword_end
{ {
SET_BEG_LINENO($<num>2);
$$ = new_block(p,$3,$4); $$ = new_block(p,$3,$4);
CLEAR_BEG_LINENO();
local_unnest(p); local_unnest(p);
} }
; ;
...@@ -5217,6 +5244,7 @@ mrb_parser_new(mrb_state *mrb) ...@@ -5217,6 +5244,7 @@ mrb_parser_new(mrb_state *mrb)
p->capture_errors = 0; p->capture_errors = 0;
p->lineno = 1; p->lineno = 1;
p->beg_lineno = 0;
p->column = 0; p->column = 0;
#if defined(PARSER_TEST) || defined(PARSER_DEBUG) #if defined(PARSER_TEST) || defined(PARSER_DEBUG)
yydebug = 1; yydebug = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment