summaryrefslogtreecommitdiff
path: root/load.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-16 17:40:00 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-16 17:40:00 +0000
commit6ff75042db1a68a23a133667b3a97c9ec23c131e (patch)
tree71b655e989f973dc4f1e2e08a63aeeb776e75956 /load.c
parentc4fdd64fe03cc5fd99cd6eee10df9b660b46167d (diff)
* compile.c, iseq.c, ruby.c, vm.c, vm_core.h, vm_eval.c: add absolute
path field into rb_iseq_t. The field contains a string representing a path to corresponding source file. or nil when the iseq is created from -e, stdin, eval, etc. This field is used for require_relative. [ruby-dev:40004] * load.c (rb_f_require_relative): add C implementation of require_relative. * prelude.rb (require_relative): get rid of Ruby implementation of require_relative. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'load.c')
-rw-r--r--load.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/load.c b/load.c
index 95be55ff67..2c391a1b86 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, Qfalse);
+ iseq = rb_iseq_new_top(node, rb_str_new2("<top (required)>"), fname, fname, Qfalse);
th->mild_compile_error--;
rb_iseq_eval(iseq);
}
@@ -448,6 +448,19 @@ rb_f_require(VALUE obj, VALUE fname)
return rb_require_safe(fname, rb_safe_level());
}
+VALUE
+rb_f_require_relative(VALUE obj, VALUE fname)
+{
+ VALUE rb_current_realfilepath(void);
+ VALUE rb_file_s_dirname(VALUE klass, VALUE fname);
+ VALUE base = rb_current_realfilepath();
+ if (NIL_P(base)) {
+ rb_raise(rb_eLoadError, "cannot infer basepath");
+ }
+ base = rb_file_s_dirname(rb_cFile, base);
+ return rb_require_safe(rb_file_expand_path(fname, base), rb_safe_level());
+}
+
static int
search_required(VALUE fname, volatile VALUE *path, int safe_level)
{
@@ -743,6 +756,7 @@ Init_load()
rb_define_global_function("load", rb_f_load, -1);
rb_define_global_function("require", rb_f_require, 1);
+ rb_define_global_function("require_relative", rb_f_require_relative, 1);
rb_define_method(rb_cModule, "autoload", rb_mod_autoload, 2);
rb_define_method(rb_cModule, "autoload?", rb_mod_autoload_p, 1);
rb_define_global_function("autoload", rb_f_autoload, 2);