* parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix
up fixnum range literal in conditional as automagical line number comparison. [ruby-core:12124], [ruby-dev:35731] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18356 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
76ef6fa16b
commit
8d0fdce468
@ -1,3 +1,9 @@
|
|||||||
|
Mon Aug 4 16:48:50 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix
|
||||||
|
up fixnum range literal in conditional as automagical line number
|
||||||
|
comparison. [ruby-core:12124], [ruby-dev:35731]
|
||||||
|
|
||||||
Mon Aug 4 14:41:25 2008 URABE Shyouhei <shyouhei@ruby-lang.org>
|
Mon Aug 4 14:41:25 2008 URABE Shyouhei <shyouhei@ruby-lang.org>
|
||||||
|
|
||||||
* lib/net/smtp.rb (Net::SMTP::rcptto): fix a typo. a patch from
|
* lib/net/smtp.rb (Net::SMTP::rcptto): fix a typo. a patch from
|
||||||
|
57
parse.y
57
parse.y
@ -229,6 +229,7 @@ struct parser_params {
|
|||||||
const char *parser_lex_pend;
|
const char *parser_lex_pend;
|
||||||
int parser_heredoc_end;
|
int parser_heredoc_end;
|
||||||
int parser_command_start;
|
int parser_command_start;
|
||||||
|
NODE *parser_deferred_nodes;
|
||||||
int parser_lex_gets_ptr;
|
int parser_lex_gets_ptr;
|
||||||
VALUE (*parser_lex_gets)(struct parser_params*,VALUE);
|
VALUE (*parser_lex_gets)(struct parser_params*,VALUE);
|
||||||
struct local_vars *parser_lvtbl;
|
struct local_vars *parser_lvtbl;
|
||||||
@ -309,6 +310,7 @@ static int parser_yyerror(struct parser_params*, const char*);
|
|||||||
#define lex_pend (parser->parser_lex_pend)
|
#define lex_pend (parser->parser_lex_pend)
|
||||||
#define heredoc_end (parser->parser_heredoc_end)
|
#define heredoc_end (parser->parser_heredoc_end)
|
||||||
#define command_start (parser->parser_command_start)
|
#define command_start (parser->parser_command_start)
|
||||||
|
#define deferred_nodes (parser->parser_deferred_nodes)
|
||||||
#define lex_gets_ptr (parser->parser_lex_gets_ptr)
|
#define lex_gets_ptr (parser->parser_lex_gets_ptr)
|
||||||
#define lex_gets (parser->parser_lex_gets)
|
#define lex_gets (parser->parser_lex_gets)
|
||||||
#define lvtbl (parser->parser_lvtbl)
|
#define lvtbl (parser->parser_lvtbl)
|
||||||
@ -434,6 +436,8 @@ static int dvar_defined_gen(struct parser_params*,ID);
|
|||||||
static int dvar_curr_gen(struct parser_params*,ID);
|
static int dvar_curr_gen(struct parser_params*,ID);
|
||||||
#define dvar_curr(id) dvar_curr_gen(parser, id)
|
#define dvar_curr(id) dvar_curr_gen(parser, id)
|
||||||
|
|
||||||
|
static void fixup_nodes(NODE **);
|
||||||
|
|
||||||
extern int rb_dvar_defined(ID);
|
extern int rb_dvar_defined(ID);
|
||||||
extern int rb_local_defined(ID);
|
extern int rb_local_defined(ID);
|
||||||
extern int rb_parse_in_eval(void);
|
extern int rb_parse_in_eval(void);
|
||||||
@ -807,6 +811,7 @@ compstmt : stmts opt_terms
|
|||||||
{
|
{
|
||||||
/*%%%*/
|
/*%%%*/
|
||||||
void_stmts($1);
|
void_stmts($1);
|
||||||
|
fixup_nodes(&deferred_nodes);
|
||||||
/*%
|
/*%
|
||||||
%*/
|
%*/
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
@ -1969,13 +1974,10 @@ arg : lhs '=' arg
|
|||||||
/*%%%*/
|
/*%%%*/
|
||||||
value_expr($1);
|
value_expr($1);
|
||||||
value_expr($3);
|
value_expr($3);
|
||||||
|
$$ = NEW_DOT2($1, $3);
|
||||||
if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) &&
|
if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) &&
|
||||||
nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) {
|
nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) {
|
||||||
$1->nd_lit = rb_range_new($1->nd_lit, $3->nd_lit, Qfalse);
|
deferred_nodes = list_append(deferred_nodes, $$);
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$$ = NEW_DOT2($1, $3);
|
|
||||||
}
|
}
|
||||||
/*%
|
/*%
|
||||||
$$ = dispatch2(dot2, $1, $3);
|
$$ = dispatch2(dot2, $1, $3);
|
||||||
@ -1986,13 +1988,10 @@ arg : lhs '=' arg
|
|||||||
/*%%%*/
|
/*%%%*/
|
||||||
value_expr($1);
|
value_expr($1);
|
||||||
value_expr($3);
|
value_expr($3);
|
||||||
|
$$ = NEW_DOT3($1, $3);
|
||||||
if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) &&
|
if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) &&
|
||||||
nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) {
|
nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) {
|
||||||
$1->nd_lit = rb_range_new($1->nd_lit, $3->nd_lit, Qtrue);
|
deferred_nodes = list_append(deferred_nodes, $$);
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$$ = NEW_DOT3($1, $3);
|
|
||||||
}
|
}
|
||||||
/*%
|
/*%
|
||||||
$$ = dispatch2(dot3, $1, $3);
|
$$ = dispatch2(dot3, $1, $3);
|
||||||
@ -4716,6 +4715,7 @@ yycompile0(VALUE arg, int tracing)
|
|||||||
}
|
}
|
||||||
|
|
||||||
parser_prepare(parser);
|
parser_prepare(parser);
|
||||||
|
deferred_nodes = 0;
|
||||||
n = yyparse((void*)parser);
|
n = yyparse((void*)parser);
|
||||||
ruby_debug_lines = 0;
|
ruby_debug_lines = 0;
|
||||||
ruby_coverage = 0;
|
ruby_coverage = 0;
|
||||||
@ -8173,6 +8173,35 @@ warning_unless_e_option(struct parser_params *parser, NODE *node, const char *st
|
|||||||
if (!e_option_supplied(parser)) parser_warning(node, str);
|
if (!e_option_supplied(parser)) parser_warning(node, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fixup_nodes(NODE **rootnode)
|
||||||
|
{
|
||||||
|
NODE *node, *next, *head;
|
||||||
|
|
||||||
|
for (node = *rootnode; node; node = next) {
|
||||||
|
enum node_type type;
|
||||||
|
VALUE val;
|
||||||
|
|
||||||
|
next = node->nd_next;
|
||||||
|
head = node->nd_head;
|
||||||
|
rb_gc_force_recycle((VALUE)node);
|
||||||
|
*rootnode = next;
|
||||||
|
switch (type = nd_type(head)) {
|
||||||
|
case NODE_DOT2:
|
||||||
|
case NODE_DOT3:
|
||||||
|
val = rb_range_new(head->nd_beg->nd_lit, head->nd_end->nd_lit,
|
||||||
|
type == NODE_DOT3 ? Qtrue : Qfalse);
|
||||||
|
rb_gc_force_recycle((VALUE)head->nd_beg);
|
||||||
|
rb_gc_force_recycle((VALUE)head->nd_end);
|
||||||
|
nd_set_type(head, NODE_LIT);
|
||||||
|
head->nd_lit = val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static NODE *cond0(struct parser_params*,NODE*);
|
static NODE *cond0(struct parser_params*,NODE*);
|
||||||
|
|
||||||
static NODE*
|
static NODE*
|
||||||
@ -8180,17 +8209,15 @@ range_op(struct parser_params *parser, NODE *node)
|
|||||||
{
|
{
|
||||||
enum node_type type;
|
enum node_type type;
|
||||||
|
|
||||||
if (!e_option_supplied(parser)) return node;
|
|
||||||
if (node == 0) return 0;
|
if (node == 0) return 0;
|
||||||
|
|
||||||
value_expr(node);
|
|
||||||
node = cond0(parser, node);
|
|
||||||
type = nd_type(node);
|
type = nd_type(node);
|
||||||
|
value_expr(node);
|
||||||
if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) {
|
if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) {
|
||||||
warn_unless_e_option(parser, node, "integer literal in conditional range");
|
warn_unless_e_option(parser, node, "integer literal in conditional range");
|
||||||
return NEW_CALL(node, tEQ, NEW_LIST(NEW_GVAR(rb_intern("$."))));
|
return NEW_CALL(node, tEQ, NEW_LIST(NEW_GVAR(rb_intern("$."))));
|
||||||
}
|
}
|
||||||
return node;
|
return cond0(parser, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -9296,6 +9323,7 @@ parser_initialize(struct parser_params *parser)
|
|||||||
parser->parser_toksiz = 0;
|
parser->parser_toksiz = 0;
|
||||||
parser->parser_heredoc_end = 0;
|
parser->parser_heredoc_end = 0;
|
||||||
parser->parser_command_start = Qtrue;
|
parser->parser_command_start = Qtrue;
|
||||||
|
parser->parser_deferred_nodes = 0;
|
||||||
parser->parser_lex_pbeg = 0;
|
parser->parser_lex_pbeg = 0;
|
||||||
parser->parser_lex_p = 0;
|
parser->parser_lex_p = 0;
|
||||||
parser->parser_lex_pend = 0;
|
parser->parser_lex_pend = 0;
|
||||||
@ -9332,6 +9360,7 @@ parser_mark(void *ptr)
|
|||||||
struct parser_params *p = (struct parser_params*)ptr;
|
struct parser_params *p = (struct parser_params*)ptr;
|
||||||
|
|
||||||
rb_gc_mark((VALUE)p->parser_lex_strterm);
|
rb_gc_mark((VALUE)p->parser_lex_strterm);
|
||||||
|
rb_gc_mark((VALUE)p->parser_deferred_nodes);
|
||||||
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);
|
rb_gc_mark(p->parser_lex_nextline);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user