From d090f17f21c1b938e9aa97c14e9e2d7e079b4420 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Sat, 27 Oct 2012 01:16:25 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37339 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ iseq.c | 7 ++++++- parse.y | 6 ++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a092d379de..acc49fbbcc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Sat Oct 27 10:12:13 2012 URABE Shyouhei + + * 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 * parse.y (enum lex_state_e): [EXPERIMENTAL] lex_state as bit field / diff --git a/iseq.c b/iseq.c index b0cf8014c9..348836b99a 100644 --- a/iseq.c +++ b/iseq.c @@ -590,11 +590,16 @@ rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE absolute_path, VALUE li 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, diff --git a/parse.y b/parse.y index fc22beac23..ac3ec3aca3 100644 --- a/parse.y +++ b/parse.y @@ -541,7 +541,6 @@ static int lvar_defined_gen(struct parser_params*, ID); #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 @@ ripper_warningS(struct parser_params *parser, const char *fmt, const char *str) 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 @@ ripper_initialize(int argc, VALUE *argv, VALUE self) 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 @@ Init_ripper(void) { 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 */