[Bug #3443] require$B$,CY$/$J$k(B

e$B%A%1%C%He(B #3443 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B%+%F%4%je(B coree$B$K%;%C%He(B
e$BC4Ev<Te(B Yusuke E.e$B$K%;%C%He(B

e$B1sF#$G$9!#e(B

prepare_iseq_build e$B$NCf$Ge(B expand_path
e$B$9$k$N$O3N$+$KCY$=$&$J$N$G!"e(B
rb_iseq_new e$B$r8F$VB&$G$=$l$>$le(B expand_path
e$B$9$k$h$&$J%Q%C%A$r=q$$$Fe(B
e$B$$^$7$?!#e(B
e$B;01:$5$s$+$i8z2L$,3NG’$7$F$b$i$C$?$i%3%
%C%H$7$h$&$H;W$$$^$9!#e(B

diff --git a/eval_intern.h b/eval_intern.h
index 909b10a…549953a 100644
— a/eval_intern.h
+++ b/eval_intern.h
@@ -205,7 +205,7 @@ NORETURN(void rb_raise_method_missing(rb_thread_t
*th, int argc, VALUE *argv,

VALUE rb_vm_make_jump_tag_but_local_jump(int state, VALUE val);
NODE *rb_vm_cref(void);
-VALUE rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg,
const rb_block_t *blockptr, VALUE filename, VALUE filepath);
+VALUE rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg,
const rb_block_t *blockptr, VALUE filename);
void rb_vm_set_progname(VALUE filename);
void rb_thread_terminate_all(void);
VALUE rb_vm_top_self();
diff --git a/iseq.c b/iseq.c
index 48d0cdf…ae45884 100644
— a/iseq.c
+++ b/iseq.c
@@ -228,7 +228,7 @@ prepare_iseq_build(rb_iseq_t *iseq,

 iseq->name = name;
 iseq->filename = filename;
  • iseq->filepath = filepath == Qnil ? Qnil :
    rb_realpath_internal(Qnil, filepath, 1);
  • iseq->filepath = filepath;
    iseq->line_no = (unsigned short)line_no; /* TODO: really enough? */
    iseq->defined_method_id = 0;
    iseq->mark_ary = rb_ary_tmp_new(3);
    @@ -606,7 +606,8 @@ iseq_s_compile_file(int argc, VALUE *argv, VALUE
    self)
    parser = rb_parser_new();
    node = rb_parser_compile_file(parser, fname, f, NUM2INT(line));
    make_compile_option(&option, opt);
  • return rb_iseq_new_with_opt(node, rb_str_new2(“”), file,
    file, line, Qfalse,
  • return rb_iseq_new_with_opt(node, rb_str_new2(“”), file,
  •    rb_realpath_internal(Qnil, file, 1), line, Qfalse,
       ISEQ_TYPE_TOP, &option);
    

}

diff --git a/load.c b/load.c
index b4ec2d9…a0e5a4b 100644
— a/load.c
+++ b/load.c
@@ -297,7 +297,7 @@ rb_load_internal(VALUE fname, int wrap)
th->mild_compile_error++;
node = (NODE *)rb_load_file(RSTRING_PTR(fname));
loaded = TRUE;

  • iseq = rb_iseq_new_top(node, rb_str_new2(“<top (required)>”), fname,
    fname, Qfalse);
  • iseq = rb_iseq_new_top(node, rb_str_new2(“<top (required)>”), fname,
    rb_realpath_internal(Qnil, fname, 1), Qfalse);
    th->mild_compile_error–;
    rb_iseq_eval(iseq);
    }
    @@ -596,7 +596,7 @@ rb_require_safe(VALUE fname, int safe)

    case 's':
      handle = (long)rb_vm_call_cfunc(rb_vm_top_self(), load_ext,
    
  •            path, 0, path, path);
    
  •            path, 0, path);
       rb_ary_push(ruby_dln_librefs, LONG2NUM(handle));
       break;
    
    }
    @@ -643,7 +643,7 @@ ruby_init_ext(const char *name, void (*init)(void))
    {
    if (load_lock(name)) {
    rb_vm_call_cfunc(rb_vm_top_self(), init_ext_call, (VALUE)init,
  •   0, rb_str_new2(name), Qnil);
    
  •   0, rb_str_new2(name));
    

    rb_provide(name);
    load_unlock(name, 1);
    }
    diff --git a/ruby.c b/ruby.c
    index daaf0d6…75ea88f 100644
    — a/ruby.c
    +++ b/ruby.c
    @@ -1462,7 +1462,8 @@ process_options(int argc, char **argv, struct
    cmdline_options *opt)

    PREPARE_PARSE_MAIN({
    VALUE path = Qnil;

  • if (!opt->e_script && strcmp(opt->script, “-”)) path =
    opt->script_name;
  • if (!opt->e_script && strcmp(opt->script, “-”))
  •  path = rb_realpath_internal(Qnil, opt->script_name, 1);
    
    iseq = rb_iseq_new_main(tree, opt->script_name, path);
    });

diff --git a/vm.c b/vm.c
index bc11094…3516024 100644
— a/vm.c
+++ b/vm.c
@@ -1450,11 +1450,11 @@ rb_thread_current_status(const rb_thread_t *th)

VALUE
rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg,

  • const rb_block_t *blockptr, VALUE filename, VALUE filepath)
    
  • const rb_block_t *blockptr, VALUE filename)
    

{
rb_thread_t *th = GET_THREAD();
const rb_control_frame_t *reg_cfp = th->cfp;

  • volatile VALUE iseqval = rb_iseq_new(0, filename, filename,
    filepath, 0, ISEQ_TYPE_TOP);
  • volatile VALUE iseqval = rb_iseq_new(0, filename, filename, Qnil,
    0, ISEQ_TYPE_TOP);
    VALUE val;

    vm_push_frame(th, DATA_PTR(iseqval), VM_FRAME_MAGIC_TOP,


Yusuke E. [email protected]

http://redmine.ruby-lang.org/issues/show/3443

e$B;01:$G$9e(B

e$B%Q%C%A$"$j$,$H$&$4$6$$$^$9!#8z2L$r3NG’$7$^$7$?!#e(B

e$B;01:$5$s$+$i8z2L$,3NG’$7$F$b$i$C$?$i%3%_%C%H$7$h$&$H;W$$$^$9!#e(B

e$B7k2L!"e(B3e$BG\0J>e$NB.EY8~>e$G$7$?!#e(B
yarv2llvme$B$Ge(Bfibe$B$r%3%s%Q%$%k$7$F<B9T$9$k;~4V$rB,Dj$7$^$7$?!#e(B3e$B2sB,Dj$7$Fe(B
e$B0lHV@.@S$NNI$$$b$N$r:$;$F$$$^$9!#e(B

Rubye$B$N%P!<%8%g%se(B
$ ruby -v
ruby 1.9.3dev (2010-06-16 trunk 28332) [i386-cygwin]

e$B%Q%C%AA0e(B

$ time ruby -I . -I lib/ yarv2llvm.rb fib.rb
102334155

real 0m34.876s
user 0m4.102s
sys 0m14.476s

e$B%Q%C%A8ee(B

$ time ruby -I . -I lib/ yarv2llvm.rb fib.rb
102334155

real 0m9.816s
user 0m2.760s
sys 0m3.462s

e$B%A%1%C%He(B #3443 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B%9%F!<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r28351.
Yusuke, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


http://redmine.ruby-lang.org/issues/show/3443