diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-03-16 17:40:00 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-03-16 17:40:00 +0000 |
commit | 6ff75042db1a68a23a133667b3a97c9ec23c131e (patch) | |
tree | 71b655e989f973dc4f1e2e08a63aeeb776e75956 /load.c | |
parent | c4fdd64fe03cc5fd99cd6eee10df9b660b46167d (diff) | |
download | ruby-6ff75042db1a68a23a133667b3a97c9ec23c131e.tar.gz |
* 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.c | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -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); |