From: Urabe Shyouhei Date: 2010-03-31T14:38:07+09:00 Subject: [ruby-dev:40872] Re: [Feature #2674] RubyVM::InstructionSequence to accept IOs _ wanabe さんは書きました: > ありがとうございます。 > NG なケースを見つけてしまったので報告します。これで SEGV します。 それはrb_compile_fileのバグでは... Signed-off-by: Urabe, Shyuohei --- iseq.c | 2 ++ parse.y | 14 ++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/iseq.c b/iseq.c index 77f1497..2cccfcc 100644 --- a/iseq.c +++ b/iseq.c @@ -551,6 +551,8 @@ rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE filepath, VALUE line, V node = rb_compile_file(fn, src, ln); else node = rb_compile_string(fn, StringValue(src), ln); + if (!node) + rb_exc_raise(GET_THREAD()->errinfo); if (th->base_block && th->base_block->iseq) { return rb_iseq_new_with_opt(node, th->base_block->iseq->name, file, filepath, line, th->base_block->iseq->self, diff --git a/parse.y b/parse.y index 340a825..438b8f5 100644 --- a/parse.y +++ b/parse.y @@ -5138,6 +5138,12 @@ lex_getline(struct parser_params *parser) static const rb_data_type_t parser_data_type; +static VALUE +lex_get_generic(struct parser_params *parser, VALUE src) +{ + return rb_funcall(src, rb_intern("gets"), 0); +} + #ifndef RIPPER static NODE* parser_compile_string(volatile VALUE vparser, const char *f, VALUE s, int line) @@ -5209,7 +5215,7 @@ rb_parser_compile_file(volatile VALUE vparser, const char *f, VALUE file, int st NODE *node; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, parser); - lex_gets = lex_io_gets; + lex_gets = lex_get_generic; lex_input = file; lex_pbeg = lex_p = lex_pend = 0; compile_for_eval = rb_parse_in_eval(); @@ -10319,11 +10325,7 @@ ripper_warningS(struct parser_params *parser, const char *fmt, const char *str) STR_NEW2(fmt), STR_NEW2(str)); } -static VALUE -ripper_lex_get_generic(struct parser_params *parser, VALUE src) -{ - return rb_funcall(src, ripper_id_gets, 0); -} +#define ripper_lex_get_generic lex_get_generic static VALUE ripper_s_allocate(VALUE klass) -- 1.6.0.4