[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]