From 6ff75042db1a68a23a133667b3a97c9ec23c131e Mon Sep 17 00:00:00 2001 From: mame Date: Tue, 16 Mar 2010 17:40:00 +0000 Subject: * 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 --- load.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'load.c') 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(""), fname, Qfalse); + iseq = rb_iseq_new_top(node, rb_str_new2(""), 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); -- cgit v1.2.3