diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-12-06 06:40:54 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-12-06 06:40:54 +0000 |
commit | 0cd28199e50039e9425f10b880c436d3ecacde0b (patch) | |
tree | 167cd97193185476d018e9f26ae512813dbc76e7 | |
parent | 98ff2bbd7a9d033a629644a4576e5293eea3dc53 (diff) |
load.c (RubyVM.resolve_feature_path): New method. [Feature #15230]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66237 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | load.c | 36 | ||||
-rw-r--r-- | vm.c | 4 |
3 files changed, 47 insertions, 0 deletions
@@ -266,6 +266,13 @@ sufficient information, see the ChangeLog file or Redmine * Range#step now returns an instance of Enumerator::ArithmeticSequence class rather than one of Enumerator class. +[RubyVM] + + [New methods] + + * RubyVM.resolve_feature_path identifies the file that will be loaded by + "require(feature)". [experimental] [Feature #15230] + [RubyVM::AbstractSyntaxTree] [New methods] @@ -943,6 +943,42 @@ load_ext(VALUE path) } /* + * call-seq: + * RubyVM.resolve_feature_path(feature) -> [:rb or :so, path] + * + * Identifies the file that will be loaded by "require(feature)". + * This API is experimental and just for internal. + * + * RubyVM.resolve_feature_path("set") + * #=> [:rb, "/path/to/feature.rb"] + */ + +VALUE +rb_resolve_feature_path(VALUE klass, VALUE fname) +{ + VALUE path; + int found; + VALUE sym; + + fname = rb_get_path_check(fname, 0); + path = rb_str_encode_ospath(fname); + found = search_required(path, &path, 0); + + switch (found) { + case 'r': + sym = ID2SYM(rb_intern("rb")); + break; + case 's': + sym = ID2SYM(rb_intern("so")); + break; + default: + load_failed(fname); + } + + return rb_ary_new_from_args(2, sym, path); +} + +/* * returns * 0: if already loaded (false) * 1: successfully loaded (true) @@ -2869,6 +2869,8 @@ static VALUE usage_analysis_operand_stop(VALUE self); static VALUE usage_analysis_register_stop(VALUE self); #endif +VALUE rb_resolve_feature_path(VALUE klass, VALUE fname); + void Init_VM(void) { @@ -3171,6 +3173,8 @@ Init_VM(void) /* vm_backtrace.c */ Init_vm_backtrace(); + + rb_define_singleton_method(rb_cRubyVM, "resolve_feature_path", rb_resolve_feature_path, 1); } void |