Bug #7716 ยป autoload.patch
load.c | ||
---|---|---|
return rb_require_safe(fname, rb_safe_level());
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* require_relative(string) -> true or false
|
||
... | ... | |
return rb_mod_autoload_p(klass, sym);
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* require_autoload(name, safelevel) -> true or false
|
||
*
|
||
* Autoload requires features by calling the <code>Kernel.require_autoload</code> method.
|
||
* This method is not useful in the general case, since it is effectively the same as calling
|
||
* <code>require<code>. But it is necessary to facilitate meta-programming of the load system.
|
||
*
|
||
*/
|
||
VALUE
|
||
rb_f_require_autoload(VALUE obj, VALUE fname, VALUE safe)
|
||
{
|
||
return rb_require_safe(fname, NUM2INT(safe));
|
||
}
|
||
void
|
||
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_global_function("require_autoload", rb_f_require_autoload, 2); */
|
||
rb_define_singleton_method(rb_mKernel, "require_autoload", rb_f_require_autoload, 2);
|
||
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);
|
test/ruby/test_autoload.rb | ||
---|---|---|
tmpdirs.each {|dir| Dir.rmdir(dir)}
|
||
end
|
||
def test_custom_autoload_require
|
||
require 'tmpdir'
|
||
tmpdir = Dir.mktmpdir('autoload')
|
||
tmpdirs = [tmpdir]
|
||
tmpdirs.unshift(tmpdir + '/foo')
|
||
Dir.mkdir(tmpdirs[0])
|
||
tmpfiles = [tmpdir + '/foo.rb', tmpdir + '/foo/bar.rb']
|
||
open(tmpfiles[0] , 'w') do |f|
|
||
f.puts <<-INPUT
|
||
$:.unshift(File.expand_path('..', __FILE__)+'/./foo')
|
||
class << Kernel
|
||
$custom_autoload = 0
|
||
alias :_require_autoload :require_autoload
|
||
def require_autoload(fn, safe)
|
||
_require_autoload(fn, safe)
|
||
$custom_autoload = 1
|
||
end
|
||
end
|
||
module Foo
|
||
autoload :Bar, 'bar'
|
||
end
|
||
Foo::Bar
|
||
p $custom_autoload
|
||
INPUT
|
||
end
|
||
open(tmpfiles[1], 'w') do |f|
|
||
f.puts 'class Foo::Bar; end'
|
||
end
|
||
assert_in_out_err([tmpfiles[0]], "", ["1"], [])
|
||
ensure
|
||
File.unlink(*tmpfiles) rescue nil if tmpfiles
|
||
tmpdirs.each {|dir| Dir.rmdir(dir)}
|
||
end
|
||
def test_autoload_p
|
||
bug4565 = '[ruby-core:35679]'
|
||
variable.c | ||
---|---|---|
autoload_require(VALUE arg)
|
||
{
|
||
struct autoload_data_i *ele = (struct autoload_data_i *)arg;
|
||
return rb_require_safe(ele->feature, ele->safe_level);
|
||
/* return rb_require_safe(ele->feature, ele->safe_level); */
|
||
VALUE fn, safe;
|
||
fn = ele->feature;
|
||
safe = INT2NUM(ele->safe_level);
|
||
return rb_funcall(rb_mKernel, rb_intern("require_autoload"), 2, fn, safe);
|
||
}
|
||
VALUE
|