mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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
					
				
					 2 changed files with 49 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -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>
 | 
			
		||||
 | 
			
		||||
	* 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;
 | 
			
		||||
    int parser_heredoc_end;
 | 
			
		||||
    int parser_command_start;
 | 
			
		||||
    NODE *parser_deferred_nodes;
 | 
			
		||||
    int parser_lex_gets_ptr;
 | 
			
		||||
    VALUE (*parser_lex_gets)(struct parser_params*,VALUE);
 | 
			
		||||
    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 heredoc_end		(parser->parser_heredoc_end)
 | 
			
		||||
#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		(parser->parser_lex_gets)
 | 
			
		||||
#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);
 | 
			
		||||
#define dvar_curr(id) dvar_curr_gen(parser, id)
 | 
			
		||||
 | 
			
		||||
static void fixup_nodes(NODE **);
 | 
			
		||||
 | 
			
		||||
extern int rb_dvar_defined(ID);
 | 
			
		||||
extern int rb_local_defined(ID);
 | 
			
		||||
extern int rb_parse_in_eval(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -807,6 +811,7 @@ compstmt	: stmts opt_terms
 | 
			
		|||
		    {
 | 
			
		||||
		    /*%%%*/
 | 
			
		||||
			void_stmts($1);
 | 
			
		||||
			fixup_nodes(&deferred_nodes);
 | 
			
		||||
		    /*%
 | 
			
		||||
		    %*/
 | 
			
		||||
			$$ = $1;
 | 
			
		||||
| 
						 | 
				
			
			@ -1969,13 +1974,10 @@ arg		: lhs '=' arg
 | 
			
		|||
		    /*%%%*/
 | 
			
		||||
			value_expr($1);
 | 
			
		||||
			value_expr($3);
 | 
			
		||||
			$$ = NEW_DOT2($1, $3);
 | 
			
		||||
			if (nd_type($1) == NODE_LIT && FIXNUM_P($1->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);
 | 
			
		||||
			    $$ = $1;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
			    $$ = NEW_DOT2($1, $3);
 | 
			
		||||
			    deferred_nodes = list_append(deferred_nodes, $$);
 | 
			
		||||
			}
 | 
			
		||||
		    /*%
 | 
			
		||||
			$$ = dispatch2(dot2, $1, $3);
 | 
			
		||||
| 
						 | 
				
			
			@ -1986,13 +1988,10 @@ arg		: lhs '=' arg
 | 
			
		|||
		    /*%%%*/
 | 
			
		||||
			value_expr($1);
 | 
			
		||||
			value_expr($3);
 | 
			
		||||
			$$ = NEW_DOT3($1, $3);
 | 
			
		||||
			if (nd_type($1) == NODE_LIT && FIXNUM_P($1->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);
 | 
			
		||||
			    $$ = $1;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
			    $$ = NEW_DOT3($1, $3);
 | 
			
		||||
			    deferred_nodes = list_append(deferred_nodes, $$);
 | 
			
		||||
			}
 | 
			
		||||
		    /*%
 | 
			
		||||
			$$ = dispatch2(dot3, $1, $3);
 | 
			
		||||
| 
						 | 
				
			
			@ -4716,6 +4715,7 @@ yycompile0(VALUE arg, int tracing)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    parser_prepare(parser);
 | 
			
		||||
    deferred_nodes = 0;
 | 
			
		||||
    n = yyparse((void*)parser);
 | 
			
		||||
    ruby_debug_lines = 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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*
 | 
			
		||||
| 
						 | 
				
			
			@ -8180,17 +8209,15 @@ range_op(struct parser_params *parser, NODE *node)
 | 
			
		|||
{
 | 
			
		||||
    enum node_type type;
 | 
			
		||||
 | 
			
		||||
    if (!e_option_supplied(parser)) return node;
 | 
			
		||||
    if (node == 0) return 0;
 | 
			
		||||
 | 
			
		||||
    value_expr(node);
 | 
			
		||||
    node = cond0(parser, node);
 | 
			
		||||
    type = nd_type(node);
 | 
			
		||||
    value_expr(node);
 | 
			
		||||
    if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) {
 | 
			
		||||
	warn_unless_e_option(parser, node, "integer literal in conditional range");
 | 
			
		||||
	return NEW_CALL(node, tEQ, NEW_LIST(NEW_GVAR(rb_intern("$."))));
 | 
			
		||||
    }
 | 
			
		||||
    return node;
 | 
			
		||||
    return cond0(parser, node);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
| 
						 | 
				
			
			@ -9296,6 +9323,7 @@ parser_initialize(struct parser_params *parser)
 | 
			
		|||
    parser->parser_toksiz = 0;
 | 
			
		||||
    parser->parser_heredoc_end = 0;
 | 
			
		||||
    parser->parser_command_start = Qtrue;
 | 
			
		||||
    parser->parser_deferred_nodes = 0;
 | 
			
		||||
    parser->parser_lex_pbeg = 0;
 | 
			
		||||
    parser->parser_lex_p = 0;
 | 
			
		||||
    parser->parser_lex_pend = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -9332,6 +9360,7 @@ parser_mark(void *ptr)
 | 
			
		|||
    struct parser_params *p = (struct parser_params*)ptr;
 | 
			
		||||
 | 
			
		||||
    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_lastline);
 | 
			
		||||
    rb_gc_mark(p->parser_lex_nextline);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue