Project

General

Profile

Feature #5221 » loaderror.patch

tenderlovemaking (Aaron Patterson), 02/25/2012 04:39 AM

View differences:

error.c
rb_eScriptError = rb_define_class("ScriptError", rb_eException);
rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError);
rb_eLoadError = rb_define_class("LoadError", rb_eScriptError);
rb_attr(rb_eLoadError, rb_intern("path"), 1, 0, Qfalse);
rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError);
rb_eNameError = rb_define_class("NameError", rb_eStandardError);
......
{
va_list args;
VALUE mesg;
VALUE err;
va_start(args, fmt);
mesg = rb_enc_vsprintf(rb_locale_encoding(), fmt, args);
va_end(args);
err = rb_exc_new3(rb_eLoadError, mesg);
rb_ivar_set(err, rb_intern("@path"), Qnil);
rb_exc_raise(err);
}
void
rb_loaderror_with_path(VALUE path, const char *fmt, ...)
{
va_list args;
VALUE mesg;
VALUE err;
va_start(args, fmt);
mesg = rb_enc_vsprintf(rb_locale_encoding(), fmt, args);
va_end(args);
rb_exc_raise(rb_exc_new3(rb_eLoadError, mesg));
err = rb_exc_new3(rb_eLoadError, mesg);
rb_ivar_set(err, rb_intern("@path"), path);
rb_exc_raise(err);
}
void
......
void
rb_load_fail(const char *path)
{
rb_loaderror("%s -- %s", strerror(errno), path);
rb_loaderror_with_path(rb_str_new2(path), "%s -- %s", strerror(errno), path);
}
void
include/ruby/intern.h
VALUE rb_exc_new2(VALUE, const char*);
VALUE rb_exc_new3(VALUE, VALUE);
PRINTF_ARGS(NORETURN(void rb_loaderror(const char*, ...)), 1, 2);
PRINTF_ARGS(NORETURN(void rb_loaderror_with_path(VALUE path, const char*, ...)), 2, 3);
PRINTF_ARGS(NORETURN(void rb_name_error(ID, const char*, ...)), 2, 3);
PRINTF_ARGS(NORETURN(void rb_name_error_str(VALUE, const char*, ...)), 2, 3);
NORETURN(void rb_invalid_str(const char*, const char*));
load.c
{
VALUE base = rb_current_realfilepath();
if (NIL_P(base)) {
rb_raise(rb_eLoadError, "cannot infer basepath");
rb_loaderror("cannot infer basepath");
}
base = rb_file_dirname(base);
return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
......
return type ? 's' : 'r';
}
void rb_loaderror_with_path(VALUE path, const char *fmt, ...);
static void
load_failed(VALUE fname)
{
VALUE mesg = rb_str_buf_new_cstr("cannot load such file -- ");
rb_str_append(mesg, fname); /* should be ASCII compatible */
rb_exc_raise(rb_exc_new3(rb_eLoadError, mesg));
rb_loaderror_with_path(fname, "cannot load such file -- %s", RSTRING_PTR(fname));
RB_GC_GUARD(fname);
}
static VALUE
ruby.c
}
}
}
rb_raise(rb_eLoadError, "no Ruby script found in input");
rb_loaderror("no Ruby script found in input");
}
c = rb_io_getbyte(f);
test/ruby/test_require.rb
require 'tmpdir'
class TestRequire < Test::Unit::TestCase
def test_load_error_path
filename = "should_not_exist"
error = assert_raises(LoadError) do
require filename
end
assert_equal filename, error.path
end
def test_require_invalid_shared_object
t = Tempfile.new(["test_ruby_test_require", ".so"])
t.puts "dummy"
(2-2/2)