Project

General

Profile

Bug #7716 ยป autoload.patch

Autoload patch for custom requires - trans (Thomas Sawyer), 01/19/2013 05:03 AM

View differences:

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
    (1-1/1)