summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--eval_intern.h2
-rw-r--r--iseq.c5
-rw-r--r--load.c6
-rw-r--r--ruby.c3
-rw-r--r--vm.c4
6 files changed, 24 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 926e5bba7b..310d760e97 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Thu Jun 17 23:20:14 2010 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * load.c (rb_load_internal): remove call to rb_realpath_internal
+ within rb_load_internal which caused big performance degradation.
+ Instead, call rb_realpath_internal in the caller of
+ rb_load_internal. [ruby-dev:41502] [ruby-dev:41610]
+
+ * vm.c (rb_vm_call_cfunc): ditto.
+
+ * eval_intern.h (rb_vm_call_cfunc): ditto.
+
+ * ruby.c (process_options): ditto.
+
Thu Jun 17 18:37:47 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* file.c (rb_str_encode_ospath): when the encoding of the parameter
diff --git a/eval_intern.h b/eval_intern.h
index 909b10abc0..549953acfc 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 48d0cdfcb9..ae45884578 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("<main>"), file, file, line, Qfalse,
+ return rb_iseq_new_with_opt(node, rb_str_new2("<main>"), file,
+ rb_realpath_internal(Qnil, file, 1), line, Qfalse,
ISEQ_TYPE_TOP, &option);
}
diff --git a/load.c b/load.c
index b4ec2d9b54..a0e5a4b5da 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 daaf0d6923..75ea88fac8 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 bc11094d4e..3516024dd5 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,