Created
August 25, 2011 17:44
-
-
Save tenderlove/1171267 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/error.c b/error.c | |
index 646fb16..b9a8bc2 100644 | |
--- a/error.c | |
+++ b/error.c | |
@@ -1390,6 +1390,12 @@ syserr_eqq(VALUE self, VALUE exc) | |
* LoadError: no such file to load -- this/file/does/not/exist | |
*/ | |
+VALUE | |
+load_error_new(VALUE file) | |
+{ | |
+ | |
+} | |
+ | |
/* | |
* Document-class: NotImplementedError | |
* | |
@@ -1564,7 +1570,10 @@ Init_Exception(void) | |
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, Qtrue); | |
+ | |
rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError); | |
rb_eNameError = rb_define_class("NameError", rb_eStandardError); | |
@@ -1615,11 +1624,29 @@ rb_loaderror(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); | |
+ 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 | |
@@ -1714,7 +1741,7 @@ rb_sys_warning(const char *fmt, ...) | |
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 | |
diff --git a/include/ruby/intern.h b/include/ruby/intern.h | |
index 27db84e..1611ab6 100644 | |
--- a/include/ruby/intern.h | |
+++ b/include/ruby/intern.h | |
@@ -208,6 +208,7 @@ VALUE rb_exc_new(VALUE, const char*, long); | |
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*)); | |
diff --git a/load.c b/load.c | |
index 9ed386d..b17ff1d 100644 | |
--- a/load.c | |
+++ b/load.c | |
@@ -478,7 +478,7 @@ rb_f_require_relative(VALUE obj, VALUE fname) | |
{ | |
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()); | |
@@ -571,12 +571,13 @@ search_required(VALUE fname, volatile VALUE *path, int 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 | |
diff --git a/ruby.c b/ruby.c | |
index b53784f..0c9653c 100644 | |
--- a/ruby.c | |
+++ b/ruby.c | |
@@ -1559,7 +1559,7 @@ load_file_internal(VALUE arg) | |
} | |
} | |
} | |
- rb_raise(rb_eLoadError, "no Ruby script found in input"); | |
+ rb_loaderror("no Ruby script found in input"); | |
} | |
c = rb_io_getbyte(f); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment