ruby-changes:25287
From: shyouhei <ko1@a...>
Date: Sat, 27 Oct 2012 10:17:01 +0900 (JST)
Subject: [ruby-changes:25287] shyouhei:r37339 (trunk): * iseq.c (rb_iseq_compile_with_option): Instead of testing
shyouhei 2012-10-27 10:16:25 +0900 (Sat, 27 Oct 2012) New Revision: 37339 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37339 Log: * iseq.c (rb_iseq_compile_with_option): Instead of testing respond_to, just check if the argument is actually a file, because by calling user-defined gets something weired can happen. Patch by Glass_saga. [ruby-dev:40202] [Bug #2861] * parse.y (ripper_initialize): ditto. Modified files: trunk/ChangeLog trunk/iseq.c trunk/parse.y Index: ChangeLog =================================================================== --- ChangeLog (revision 37338) +++ ChangeLog (revision 37339) @@ -1,3 +1,12 @@ +Sat Oct 27 10:12:13 2012 URABE Shyouhei <shyouhei@r...> + + * iseq.c (rb_iseq_compile_with_option): Instead of testing + respond_to, just check if the argument is actually a file, + because by calling user-defined gets something weired can + happen. Patch by Glass_saga. [ruby-dev:40202] [Bug #2861] + + * parse.y (ripper_initialize): ditto. + Sat Oct 27 10:07:57 2012 Nobuyoshi Nakada <nobu@r...> * parse.y (enum lex_state_e): [EXPERIMENTAL] lex_state as bit field / Index: iseq.c =================================================================== --- iseq.c (revision 37338) +++ iseq.c (revision 37339) @@ -590,11 +590,16 @@ if ((state = EXEC_TAG()) == 0) { int ln = NUM2INT(line); const char *fn = StringValueCStr(file); - NODE *node = parse_string(StringValue(src), fn, ln); + NODE *node; rb_compile_option_t option; make_compile_option(&option, opt); + if (RB_TYPE_P((src), T_FILE)) + node = rb_compile_file(fn, src, ln); + else + node = parse_string(StringValue(src), fn, ln); + if (base_block && base_block->iseq) { iseqval = rb_iseq_new_with_opt(node, base_block->iseq->location.label, file, absolute_path, line, base_block->iseq->self, Index: parse.y =================================================================== --- parse.y (revision 37338) +++ parse.y (revision 37339) @@ -541,7 +541,6 @@ #include "eventids1.c" #include "eventids2.c" -static ID ripper_id_gets; static VALUE ripper_dispatch0(struct parser_params*,ID); static VALUE ripper_dispatch1(struct parser_params*,ID,VALUE); @@ -11083,7 +11082,7 @@ static VALUE ripper_lex_get_generic(struct parser_params *parser, VALUE src) { - return rb_funcall(src, ripper_id_gets, 0); + return rb_io_gets(src); } static VALUE @@ -11119,7 +11118,7 @@ TypedData_Get_Struct(self, struct parser_params, &parser_data_type, parser); rb_scan_args(argc, argv, "12", &src, &fname, &lineno); - if (rb_obj_respond_to(src, ripper_id_gets, 0)) { + if (RB_TYPE_P(src, T_FILE)) { parser->parser_lex_gets = ripper_lex_get_generic; } else { @@ -11283,7 +11282,6 @@ { parser_data_type.parent = RTYPEDDATA_TYPE(rb_parser_new()); - ripper_id_gets = rb_intern("gets"); ripper_init_eventids1(); ripper_init_eventids2(); /* ensure existing in symbol table */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/