1 /**********************************************************************
6 created at: Mon Aug 9 16:11:34 JST 1993
8 Copyright (C) 1993-2007 Yukihiro Matsumoto
10 **********************************************************************/
12 #include "ruby/ruby.h"
22 #define EXIT_SUCCESS 0
25 extern const char ruby_description
[];
28 err_position_0(char *buf
, long len
, const char *file
, int line
)
34 return snprintf(buf
, len
, "%s: ", file
);
37 return snprintf(buf
, len
, "%s:%d: ", file
, line
);
42 err_position(char *buf
, long len
)
44 return err_position_0(buf
, len
, rb_sourcefile(), rb_sourceline());
48 err_snprintf(char *buf
, long len
, const char *fmt
, va_list args
)
52 n
= err_position(buf
, len
);
54 vsnprintf((char*)buf
+n
, len
-n
, fmt
, args
);
59 compile_snprintf(char *buf
, long len
, const char *file
, int line
, const char *fmt
, va_list args
)
63 n
= err_position_0(buf
, len
, file
, line
);
65 vsnprintf((char*)buf
+n
, len
-n
, fmt
, args
);
69 static void err_append(const char*);
72 rb_compile_error(const char *file
, int line
, const char *fmt
, ...)
78 compile_snprintf(buf
, BUFSIZ
, file
, line
, fmt
, args
);
84 rb_compile_error_append(const char *fmt
, ...)
90 vsnprintf(buf
, BUFSIZ
, fmt
, args
);
96 compile_warn_print(const char *file
, int line
, const char *fmt
, va_list args
)
101 compile_snprintf(buf
, BUFSIZ
, file
, line
, fmt
, args
);
104 rb_write_error2(buf
, len
);
108 rb_compile_warn(const char *file
, int line
, const char *fmt
, ...)
113 if (NIL_P(ruby_verbose
)) return;
115 snprintf(buf
, BUFSIZ
, "warning: %s", fmt
);
118 compile_warn_print(file
, line
, buf
, args
);
122 /* rb_compile_warning() reports only in verbose mode */
124 rb_compile_warning(const char *file
, int line
, const char *fmt
, ...)
129 if (!RTEST(ruby_verbose
)) return;
131 snprintf(buf
, BUFSIZ
, "warning: %s", fmt
);
134 compile_warn_print(file
, line
, buf
, args
);
139 warn_print(const char *fmt
, va_list args
)
144 err_snprintf(buf
, BUFSIZ
, fmt
, args
);
147 rb_write_error2(buf
, len
);
151 rb_warn(const char *fmt
, ...)
156 if (NIL_P(ruby_verbose
)) return;
158 snprintf(buf
, BUFSIZ
, "warning: %s", fmt
);
161 warn_print(buf
, args
);
165 /* rb_warning() reports only in verbose mode */
167 rb_warning(const char *fmt
, ...)
172 if (!RTEST(ruby_verbose
)) return;
174 snprintf(buf
, BUFSIZ
, "warning: %s", fmt
);
177 warn_print(buf
, args
);
185 * Display the given message (followed by a newline) on STDERR unless
186 * warnings are disabled (for example with the <code>-W0</code> flag).
190 rb_warn_m(VALUE self
, VALUE mesg
)
192 if (!NIL_P(ruby_verbose
)) {
193 rb_io_write(rb_stderr
, mesg
);
194 rb_io_write(rb_stderr
, rb_default_rs
);
199 void rb_vm_bugreport(void);
202 report_bug(const char *file
, int line
, const char *fmt
, va_list args
)
206 int len
= err_position_0(buf
, BUFSIZ
, file
, line
);
208 if (fwrite(buf
, 1, len
, out
) == len
||
209 fwrite(buf
, 1, len
, (out
= stdout
)) == len
) {
210 fputs("[BUG] ", out
);
211 vfprintf(out
, fmt
, args
);
212 fprintf(out
, "\n%s\n\n", ruby_description
);
218 rb_bug(const char *fmt
, ...)
223 report_bug(rb_sourcefile(), rb_sourceline(), fmt
, args
);
230 rb_compile_bug(const char *file
, int line
, const char *fmt
, ...)
235 report_bug(file
, line
, fmt
, args
);
241 static const struct types
{
244 } builtin_types
[] = {
246 {T_OBJECT
, "Object"},
248 {T_ICLASS
, "iClass"}, /* internal use: mixed-in module holder */
249 {T_MODULE
, "Module"},
251 {T_STRING
, "String"},
252 {T_REGEXP
, "Regexp"},
254 {T_FIXNUM
, "Fixnum"},
256 {T_STRUCT
, "Struct"},
257 {T_BIGNUM
, "Bignum"},
259 {T_RATIONAL
,"Rational"},
260 {T_COMPLEX
, "Complex"},
263 {T_SYMBOL
, "Symbol"}, /* :symbol */
264 {T_DATA
, "Data"}, /* internal use: wrapped C pointers */
265 {T_MATCH
, "MatchData"}, /* data of $~ */
266 {T_NODE
, "Node"}, /* internal use: syntax tree node */
267 {T_UNDEF
, "undef"}, /* internal use: #undef; should not happen */
271 rb_check_type(VALUE x
, int t
)
273 const struct types
*type
= builtin_types
;
274 const struct types
*const typeend
= builtin_types
+
275 sizeof(builtin_types
) / sizeof(builtin_types
[0]);
278 rb_bug("undef leaked to the Ruby space");
282 while (type
< typeend
) {
283 if (type
->type
== t
) {
289 else if (FIXNUM_P(x
)) {
292 else if (SYMBOL_P(x
)) {
295 else if (rb_special_const_p(x
)) {
296 etype
= RSTRING_PTR(rb_obj_as_string(x
));
299 etype
= rb_obj_classname(x
);
301 rb_raise(rb_eTypeError
, "wrong argument type %s (expected %s)",
306 rb_bug("unknown type 0x%x (0x%x given)", t
, TYPE(x
));
310 /* exception classes */
314 VALUE rb_eSystemExit
;
318 VALUE rb_eStandardError
;
319 VALUE rb_eRuntimeError
;
322 VALUE rb_eIndexError
;
324 VALUE rb_eRangeError
;
326 VALUE rb_eNoMethodError
;
327 VALUE rb_eSecurityError
;
328 VALUE rb_eNotImpError
;
329 VALUE rb_eNoMemError
;
330 VALUE rb_cNameErrorMesg
;
332 VALUE rb_eScriptError
;
333 VALUE rb_eSyntaxError
;
336 VALUE rb_eSystemCallError
;
338 static VALUE rb_eNOERROR
;
341 rb_exc_new(VALUE etype
, const char *ptr
, long len
)
343 return rb_funcall(etype
, rb_intern("new"), 1, rb_str_new(ptr
, len
));
347 rb_exc_new2(VALUE etype
, const char *s
)
349 return rb_exc_new(etype
, s
, strlen(s
));
353 rb_exc_new3(VALUE etype
, VALUE str
)
356 return rb_funcall(etype
, rb_intern("new"), 1, str
);
361 * Exception.new(msg = nil) => exception
363 * Construct a new Exception object, optionally passing in
368 exc_initialize(int argc
, VALUE
*argv
, VALUE exc
)
372 rb_scan_args(argc
, argv
, "01", &arg
);
373 rb_iv_set(exc
, "mesg", arg
);
374 rb_iv_set(exc
, "bt", Qnil
);
380 * Document-method: exception
383 * exc.exception(string) -> an_exception or exc
385 * With no argument, or if the argument is the same as the receiver,
386 * return the receiver. Otherwise, create a new
387 * exception object of the same class as the receiver, but with a
388 * message equal to <code>string.to_str</code>.
393 exc_exception(int argc
, VALUE
*argv
, VALUE self
)
397 if (argc
== 0) return self
;
398 if (argc
== 1 && self
== argv
[0]) return self
;
399 exc
= rb_obj_clone(self
);
400 exc_initialize(argc
, argv
, exc
);
407 * exception.to_s => string
409 * Returns exception's message (or the name of the exception if
410 * no message is set).
416 VALUE mesg
= rb_attr_get(exc
, rb_intern("mesg"));
418 if (NIL_P(mesg
)) return rb_class_name(CLASS_OF(exc
));
419 if (OBJ_TAINTED(exc
)) OBJ_TAINT(mesg
);
425 * exception.message => string
427 * Returns the result of invoking <code>exception.to_s</code>.
428 * Normally this returns the exception's message or name. By
429 * supplying a to_str method, exceptions are agreeing to
430 * be used where Strings are expected.
434 exc_message(VALUE exc
)
436 return rb_funcall(exc
, rb_intern("to_s"), 0, 0);
441 * exception.inspect => string
443 * Return this exception's class name an message
447 exc_inspect(VALUE exc
)
451 klass
= CLASS_OF(exc
);
452 exc
= rb_obj_as_string(exc
);
453 if (RSTRING_LEN(exc
) == 0) {
454 return rb_str_dup(rb_class_name(klass
));
457 str
= rb_str_buf_new2("#<");
458 klass
= rb_class_name(klass
);
459 rb_str_buf_append(str
, klass
);
460 rb_str_buf_cat(str
, ": ", 2);
461 rb_str_buf_append(str
, exc
);
462 rb_str_buf_cat(str
, ">", 1);
469 * exception.backtrace => array
471 * Returns any backtrace associated with the exception. The backtrace
472 * is an array of strings, each containing either ``filename:lineNo: in
473 * `method''' or ``filename:lineNo.''
486 * print detail.backtrace.join("\n")
497 exc_backtrace(VALUE exc
)
502 return rb_attr_get(exc
, bt
);
506 rb_check_backtrace(VALUE bt
)
509 static const char err
[] = "backtrace must be Array of String";
514 if (t
== T_STRING
) return rb_ary_new3(1, bt
);
516 rb_raise(rb_eTypeError
, err
);
518 for (i
=0;i
<RARRAY_LEN(bt
);i
++) {
519 if (TYPE(RARRAY_PTR(bt
)[i
]) != T_STRING
) {
520 rb_raise(rb_eTypeError
, err
);
529 * exc.set_backtrace(array) => array
531 * Sets the backtrace information associated with <i>exc</i>. The
532 * argument must be an array of <code>String</code> objects in the
533 * format described in <code>Exception#backtrace</code>.
538 exc_set_backtrace(VALUE exc
, VALUE bt
)
540 return rb_iv_set(exc
, "bt", rb_check_backtrace(bt
));
545 * exc == obj => true or false
547 * Equality---If <i>obj</i> is not an <code>Exception</code>, returns
548 * <code>false</code>. Otherwise, returns <code>true</code> if <i>exc</i> and
549 * <i>obj</i> share same class, messages, and backtrace.
553 exc_equal(VALUE exc
, VALUE obj
)
557 if (exc
== obj
) return Qtrue
;
558 if (rb_obj_class(exc
) != rb_obj_class(obj
))
559 return rb_equal(obj
, exc
);
560 CONST_ID(id_mesg
, "mesg");
561 if (!rb_equal(rb_attr_get(exc
, id_mesg
), rb_attr_get(obj
, id_mesg
)))
563 if (!rb_equal(exc_backtrace(exc
), exc_backtrace(obj
)))
570 * SystemExit.new(status=0) => system_exit
572 * Create a new +SystemExit+ exception with the given status.
576 exit_initialize(int argc
, VALUE
*argv
, VALUE exc
)
578 VALUE status
= INT2FIX(EXIT_SUCCESS
);
579 if (argc
> 0 && FIXNUM_P(argv
[0])) {
583 rb_call_super(argc
, argv
);
584 rb_iv_set(exc
, "status", status
);
591 * system_exit.status => fixnum
593 * Return the status value associated with this system exit.
597 exit_status(VALUE exc
)
599 return rb_attr_get(exc
, rb_intern("status"));
605 * system_exit.success? => true or false
607 * Returns +true+ if exiting successful, +false+ if not.
611 exit_success_p(VALUE exc
)
613 VALUE status
= rb_attr_get(exc
, rb_intern("status"));
614 if (NIL_P(status
)) return Qtrue
;
615 if (status
== INT2FIX(EXIT_SUCCESS
)) return Qtrue
;
620 rb_name_error(ID id
, const char *fmt
, ...)
627 vsnprintf(buf
, BUFSIZ
, fmt
, args
);
630 argv
[0] = rb_str_new2(buf
);
631 argv
[1] = ID2SYM(id
);
632 exc
= rb_class_new_instance(2, argv
, rb_eNameError
);
638 * NameError.new(msg [, name]) => name_error
640 * Construct a new NameError exception. If given the <i>name</i>
641 * parameter may subsequently be examined using the <code>NameError.name</code>
646 name_err_initialize(int argc
, VALUE
*argv
, VALUE self
)
650 name
= (argc
> 1) ? argv
[--argc
] : Qnil
;
651 rb_call_super(argc
, argv
);
652 rb_iv_set(self
, "name", name
);
658 * name_error.name => string or nil
660 * Return the name associated with this NameError exception.
664 name_err_name(VALUE self
)
666 return rb_attr_get(self
, rb_intern("name"));
671 * name_error.to_s => string
673 * Produce a nicely-formatted string representing the +NameError+.
677 name_err_to_s(VALUE exc
)
679 VALUE mesg
= rb_attr_get(exc
, rb_intern("mesg"));
682 if (NIL_P(mesg
)) return rb_class_name(CLASS_OF(exc
));
685 rb_iv_set(exc
, "mesg", mesg
= str
);
687 if (OBJ_TAINTED(exc
)) OBJ_TAINT(mesg
);
693 * NoMethodError.new(msg, name [, args]) => no_method_error
695 * Construct a NoMethodError exception for a method of the given name
696 * called with the given arguments. The name may be accessed using
697 * the <code>#name</code> method on the resulting object, and the
698 * arguments using the <code>#args</code> method.
702 nometh_err_initialize(int argc
, VALUE
*argv
, VALUE self
)
704 VALUE args
= (argc
> 2) ? argv
[--argc
] : Qnil
;
705 name_err_initialize(argc
, argv
, self
);
706 rb_iv_set(self
, "args", args
);
712 name_err_mesg_mark(VALUE
*ptr
)
714 rb_gc_mark_locations(ptr
, ptr
+3);
719 name_err_mesg_new(VALUE obj
, VALUE mesg
, VALUE recv
, VALUE method
)
721 VALUE
*ptr
= ALLOC_N(VALUE
, 3);
726 return Data_Wrap_Struct(rb_cNameErrorMesg
, name_err_mesg_mark
, -1, ptr
);
731 name_err_mesg_equal(VALUE obj1
, VALUE obj2
)
736 if (obj1
== obj2
) return Qtrue
;
737 if (rb_obj_class(obj2
) != rb_cNameErrorMesg
)
740 Data_Get_Struct(obj1
, VALUE
, ptr1
);
741 Data_Get_Struct(obj2
, VALUE
, ptr2
);
742 for (i
=0; i
<3; i
++) {
743 if (!rb_equal(ptr1
[i
], ptr2
[i
]))
751 name_err_mesg_to_str(VALUE obj
)
754 Data_Get_Struct(obj
, VALUE
, ptr
);
757 if (NIL_P(mesg
)) return Qnil
;
759 const char *desc
= 0;
760 VALUE d
= 0, args
[3];
774 d
= rb_protect(rb_inspect
, obj
, 0);
775 if (NIL_P(d
) || RSTRING_LEN(d
) > 65) {
776 d
= rb_any_to_s(obj
);
778 desc
= RSTRING_PTR(d
);
781 if (desc
&& desc
[0] != '#') {
782 d
= rb_str_new2(desc
);
784 rb_str_cat2(d
, rb_obj_classname(obj
));
789 mesg
= rb_f_sprintf(3, args
);
791 if (OBJ_TAINTED(obj
)) OBJ_TAINT(mesg
);
797 name_err_mesg_load(VALUE klass
, VALUE str
)
804 * no_method_error.args => obj
806 * Return the arguments passed in as the third parameter to
811 nometh_err_args(VALUE self
)
813 return rb_attr_get(self
, rb_intern("args"));
817 rb_invalid_str(const char *str
, const char *type
)
819 VALUE s
= rb_str_inspect(rb_str_new2(str
));
821 rb_raise(rb_eArgError
, "invalid value for %s: %s", type
, RSTRING_PTR(s
));
825 * Document-module: Errno
827 * Ruby exception objects are subclasses of <code>Exception</code>.
828 * However, operating systems typically report errors using plain
829 * integers. Module <code>Errno</code> is created dynamically to map
830 * these operating system errors to Ruby classes, with each error
831 * number generating its own subclass of <code>SystemCallError</code>.
832 * As the subclass is created in module <code>Errno</code>, its name
833 * will start <code>Errno::</code>.
835 * The names of the <code>Errno::</code> classes depend on
836 * the environment in which Ruby runs. On a typical Unix or Windows
837 * platform, there are <code>Errno</code> classes such as
838 * <code>Errno::EACCES</code>, <code>Errno::EAGAIN</code>,
839 * <code>Errno::EINTR</code>, and so on.
841 * The integer operating system error number corresponding to a
842 * particular error is available as the class constant
843 * <code>Errno::</code><em>error</em><code>::Errno</code>.
845 * Errno::EACCES::Errno #=> 13
846 * Errno::EAGAIN::Errno #=> 11
847 * Errno::EINTR::Errno #=> 4
849 * The full list of operating system errors on your particular platform
850 * are available as the constants of <code>Errno</code>.
852 * Errno.constants #=> :E2BIG, :EACCES, :EADDRINUSE, :EADDRNOTAVAIL, ...
855 static st_table
*syserr_tbl
;
858 set_syserr(int n
, const char *name
)
862 if (!st_lookup(syserr_tbl
, n
, &error
)) {
863 error
= rb_define_class_under(rb_mErrno
, name
, rb_eSystemCallError
);
864 rb_define_const(error
, "Errno", INT2NUM(n
));
865 st_add_direct(syserr_tbl
, n
, error
);
868 rb_define_const(rb_mErrno
, name
, error
);
878 if (!st_lookup(syserr_tbl
, n
, &error
)) {
879 char name
[8]; /* some Windows' errno have 5 digits. */
881 snprintf(name
, sizeof(name
), "E%03d", n
);
882 error
= set_syserr(n
, name
);
889 * SystemCallError.new(msg, errno) => system_call_error_subclass
891 * If _errno_ corresponds to a known system error code, constructs
892 * the appropriate <code>Errno</code> class for that error, otherwise
893 * constructs a generic <code>SystemCallError</code> object. The
894 * error number is subsequently available via the <code>errno</code>
899 syserr_initialize(int argc
, VALUE
*argv
, VALUE self
)
901 #if !defined(_WIN32) && !defined(__VMS)
906 VALUE klass
= rb_obj_class(self
);
908 if (klass
== rb_eSystemCallError
) {
909 rb_scan_args(argc
, argv
, "11", &mesg
, &error
);
910 if (argc
== 1 && FIXNUM_P(mesg
)) {
911 error
= mesg
; mesg
= Qnil
;
913 if (!NIL_P(error
) && st_lookup(syserr_tbl
, NUM2LONG(error
), &klass
)) {
915 if (TYPE(self
) != T_OBJECT
) { /* insurance to avoid type crash */
916 rb_raise(rb_eTypeError
, "invalid instance type");
918 RBASIC(self
)->klass
= klass
;
922 rb_scan_args(argc
, argv
, "01", &mesg
);
923 error
= rb_const_get(klass
, rb_intern("Errno"));
925 if (!NIL_P(error
)) err
= strerror(NUM2LONG(error
));
926 else err
= "unknown error";
931 mesg
= rb_sprintf("%s - %.*s", err
,
932 (int)RSTRING_LEN(str
), RSTRING_PTR(str
));
935 mesg
= rb_str_new2(err
);
937 rb_call_super(1, &mesg
);
938 rb_iv_set(self
, "errno", error
);
944 * system_call_error.errno => fixnum
946 * Return this SystemCallError's error number.
950 syserr_errno(VALUE self
)
952 return rb_attr_get(self
, rb_intern("errno"));
957 * system_call_error === other => true or false
959 * Return +true+ if the receiver is a generic +SystemCallError+, or
960 * if the error numbers _self_ and _other_ are the same.
964 syserr_eqq(VALUE self
, VALUE exc
)
969 CONST_ID(en
, "errno");
971 if (!rb_obj_is_kind_of(exc
, rb_eSystemCallError
)) {
972 if (!rb_respond_to(exc
, en
)) return Qfalse
;
974 else if (self
== rb_eSystemCallError
) return Qtrue
;
976 num
= rb_attr_get(exc
, rb_intern("errno"));
978 num
= rb_funcall(exc
, en
, 0, 0);
980 e
= rb_const_get(self
, rb_intern("Errno"));
981 if (FIXNUM_P(num
) ? num
== e
: rb_equal(num
, e
))
988 * Errno.const_missing => SystemCallError
990 * Returns default SystemCallError class.
993 errno_missing(VALUE self
, VALUE id
)
999 * Descendants of class <code>Exception</code> are used to communicate
1000 * between <code>raise</code> methods and <code>rescue</code>
1001 * statements in <code>begin/end</code> blocks. <code>Exception</code>
1002 * objects carry information about the exception---its type (the
1003 * exception's class name), an optional descriptive string, and
1004 * optional traceback information. Programs may subclass
1005 * <code>Exception</code> to add additional information.
1009 Init_Exception(void)
1011 rb_eException
= rb_define_class("Exception", rb_cObject
);
1012 rb_define_singleton_method(rb_eException
, "exception", rb_class_new_instance
, -1);
1013 rb_define_method(rb_eException
, "exception", exc_exception
, -1);
1014 rb_define_method(rb_eException
, "initialize", exc_initialize
, -1);
1015 rb_define_method(rb_eException
, "==", exc_equal
, 1);
1016 rb_define_method(rb_eException
, "to_s", exc_to_s
, 0);
1017 rb_define_method(rb_eException
, "message", exc_message
, 0);
1018 rb_define_method(rb_eException
, "inspect", exc_inspect
, 0);
1019 rb_define_method(rb_eException
, "backtrace", exc_backtrace
, 0);
1020 rb_define_method(rb_eException
, "set_backtrace", exc_set_backtrace
, 1);
1022 rb_eSystemExit
= rb_define_class("SystemExit", rb_eException
);
1023 rb_define_method(rb_eSystemExit
, "initialize", exit_initialize
, -1);
1024 rb_define_method(rb_eSystemExit
, "status", exit_status
, 0);
1025 rb_define_method(rb_eSystemExit
, "success?", exit_success_p
, 0);
1027 rb_eFatal
= rb_define_class("fatal", rb_eException
);
1028 rb_eSignal
= rb_define_class("SignalException", rb_eException
);
1029 rb_eInterrupt
= rb_define_class("Interrupt", rb_eSignal
);
1031 rb_eStandardError
= rb_define_class("StandardError", rb_eException
);
1032 rb_eTypeError
= rb_define_class("TypeError", rb_eStandardError
);
1033 rb_eArgError
= rb_define_class("ArgumentError", rb_eStandardError
);
1034 rb_eIndexError
= rb_define_class("IndexError", rb_eStandardError
);
1035 rb_eKeyError
= rb_define_class("KeyError", rb_eIndexError
);
1036 rb_eRangeError
= rb_define_class("RangeError", rb_eStandardError
);
1038 rb_eScriptError
= rb_define_class("ScriptError", rb_eException
);
1039 rb_eSyntaxError
= rb_define_class("SyntaxError", rb_eScriptError
);
1040 rb_eLoadError
= rb_define_class("LoadError", rb_eScriptError
);
1041 rb_eNotImpError
= rb_define_class("NotImplementedError", rb_eScriptError
);
1043 rb_eNameError
= rb_define_class("NameError", rb_eStandardError
);
1044 rb_define_method(rb_eNameError
, "initialize", name_err_initialize
, -1);
1045 rb_define_method(rb_eNameError
, "name", name_err_name
, 0);
1046 rb_define_method(rb_eNameError
, "to_s", name_err_to_s
, 0);
1047 rb_cNameErrorMesg
= rb_define_class_under(rb_eNameError
, "message", rb_cData
);
1048 rb_define_singleton_method(rb_cNameErrorMesg
, "!", name_err_mesg_new
, 3);
1049 rb_define_method(rb_cNameErrorMesg
, "==", name_err_mesg_equal
, 1);
1050 rb_define_method(rb_cNameErrorMesg
, "to_str", name_err_mesg_to_str
, 0);
1051 rb_define_method(rb_cNameErrorMesg
, "_dump", name_err_mesg_to_str
, 1);
1052 rb_define_singleton_method(rb_cNameErrorMesg
, "_load", name_err_mesg_load
, 1);
1053 rb_eNoMethodError
= rb_define_class("NoMethodError", rb_eNameError
);
1054 rb_define_method(rb_eNoMethodError
, "initialize", nometh_err_initialize
, -1);
1055 rb_define_method(rb_eNoMethodError
, "args", nometh_err_args
, 0);
1057 rb_eRuntimeError
= rb_define_class("RuntimeError", rb_eStandardError
);
1058 rb_eSecurityError
= rb_define_class("SecurityError", rb_eException
);
1059 rb_eNoMemError
= rb_define_class("NoMemoryError", rb_eException
);
1061 syserr_tbl
= st_init_numtable();
1062 rb_eSystemCallError
= rb_define_class("SystemCallError", rb_eStandardError
);
1063 rb_define_method(rb_eSystemCallError
, "initialize", syserr_initialize
, -1);
1064 rb_define_method(rb_eSystemCallError
, "errno", syserr_errno
, 0);
1065 rb_define_singleton_method(rb_eSystemCallError
, "===", syserr_eqq
, 1);
1067 rb_mErrno
= rb_define_module("Errno");
1068 rb_define_singleton_method(rb_mErrno
, "const_missing", errno_missing
, 1);
1070 rb_define_global_function("warn", rb_warn_m
, 1);
1074 rb_raise(VALUE exc
, const char *fmt
, ...)
1080 vsnprintf(buf
, BUFSIZ
, fmt
, args
);
1082 rb_exc_raise(rb_exc_new2(exc
, buf
));
1086 rb_loaderror(const char *fmt
, ...)
1091 va_start(args
, fmt
);
1092 vsnprintf(buf
, BUFSIZ
, fmt
, args
);
1094 rb_exc_raise(rb_exc_new2(rb_eLoadError
, buf
));
1098 rb_notimplement(void)
1100 rb_raise(rb_eNotImpError
,
1101 "%s() function is unimplemented on this machine",
1102 rb_id2name(rb_frame_this_func()));
1106 rb_fatal(const char *fmt
, ...)
1111 va_start(args
, fmt
);
1112 vsnprintf(buf
, BUFSIZ
, fmt
, args
);
1115 rb_exc_fatal(rb_exc_new2(rb_eFatal
, buf
));
1119 rb_sys_fail(const char *mesg
)
1126 rb_bug("rb_sys_fail(%s) - errno == 0", mesg
? mesg
: "");
1129 arg
= mesg
? rb_str_new2(mesg
) : Qnil
;
1130 rb_exc_raise(rb_class_new_instance(1, &arg
, get_syserr(n
)));
1134 rb_sys_warning(const char *fmt
, ...)
1142 if (!RTEST(ruby_verbose
)) return;
1144 snprintf(buf
, BUFSIZ
, "warning: %s", fmt
);
1145 snprintf(buf
+strlen(buf
), BUFSIZ
-strlen(buf
), ": %s", strerror(errno_save
));
1147 va_start(args
, fmt
);
1148 warn_print(buf
, args
);
1154 rb_load_fail(const char *path
)
1156 rb_loaderror("%s -- %s", strerror(errno
), path
);
1160 rb_error_frozen(const char *what
)
1162 rb_raise(rb_eRuntimeError
, "can't modify frozen %s", what
);
1166 rb_check_frozen(VALUE obj
)
1168 if (OBJ_FROZEN(obj
)) rb_error_frozen(rb_obj_classname(obj
));
1175 set_syserr(EPERM
, "EPERM");
1178 set_syserr(ENOENT
, "ENOENT");
1181 set_syserr(ESRCH
, "ESRCH");
1184 set_syserr(EINTR
, "EINTR");
1187 set_syserr(EIO
, "EIO");
1190 set_syserr(ENXIO
, "ENXIO");
1193 set_syserr(E2BIG
, "E2BIG");
1196 set_syserr(ENOEXEC
, "ENOEXEC");
1199 set_syserr(EBADF
, "EBADF");
1202 set_syserr(ECHILD
, "ECHILD");
1205 set_syserr(EAGAIN
, "EAGAIN");
1208 set_syserr(ENOMEM
, "ENOMEM");
1211 set_syserr(EACCES
, "EACCES");
1214 set_syserr(EFAULT
, "EFAULT");
1217 set_syserr(ENOTBLK
, "ENOTBLK");
1220 set_syserr(EBUSY
, "EBUSY");
1223 set_syserr(EEXIST
, "EEXIST");
1226 set_syserr(EXDEV
, "EXDEV");
1229 set_syserr(ENODEV
, "ENODEV");
1232 set_syserr(ENOTDIR
, "ENOTDIR");
1235 set_syserr(EISDIR
, "EISDIR");
1238 set_syserr(EINVAL
, "EINVAL");
1241 set_syserr(ENFILE
, "ENFILE");
1244 set_syserr(EMFILE
, "EMFILE");
1247 set_syserr(ENOTTY
, "ENOTTY");
1250 set_syserr(ETXTBSY
, "ETXTBSY");
1253 set_syserr(EFBIG
, "EFBIG");
1256 set_syserr(ENOSPC
, "ENOSPC");
1259 set_syserr(ESPIPE
, "ESPIPE");
1262 set_syserr(EROFS
, "EROFS");
1265 set_syserr(EMLINK
, "EMLINK");
1268 set_syserr(EPIPE
, "EPIPE");
1271 set_syserr(EDOM
, "EDOM");
1274 set_syserr(ERANGE
, "ERANGE");
1277 set_syserr(EDEADLK
, "EDEADLK");
1280 set_syserr(ENAMETOOLONG
, "ENAMETOOLONG");
1283 set_syserr(ENOLCK
, "ENOLCK");
1286 set_syserr(ENOSYS
, "ENOSYS");
1289 set_syserr(ENOTEMPTY
, "ENOTEMPTY");
1292 set_syserr(ELOOP
, "ELOOP");
1295 set_syserr(EWOULDBLOCK
, "EWOULDBLOCK");
1298 set_syserr(ENOMSG
, "ENOMSG");
1301 set_syserr(EIDRM
, "EIDRM");
1304 set_syserr(ECHRNG
, "ECHRNG");
1307 set_syserr(EL2NSYNC
, "EL2NSYNC");
1310 set_syserr(EL3HLT
, "EL3HLT");
1313 set_syserr(EL3RST
, "EL3RST");
1316 set_syserr(ELNRNG
, "ELNRNG");
1319 set_syserr(EUNATCH
, "EUNATCH");
1322 set_syserr(ENOCSI
, "ENOCSI");
1325 set_syserr(EL2HLT
, "EL2HLT");
1328 set_syserr(EBADE
, "EBADE");
1331 set_syserr(EBADR
, "EBADR");
1334 set_syserr(EXFULL
, "EXFULL");
1337 set_syserr(ENOANO
, "ENOANO");
1340 set_syserr(EBADRQC
, "EBADRQC");
1343 set_syserr(EBADSLT
, "EBADSLT");
1346 set_syserr(EDEADLOCK
, "EDEADLOCK");
1349 set_syserr(EBFONT
, "EBFONT");
1352 set_syserr(ENOSTR
, "ENOSTR");
1355 set_syserr(ENODATA
, "ENODATA");
1358 set_syserr(ETIME
, "ETIME");
1361 set_syserr(ENOSR
, "ENOSR");
1364 set_syserr(ENONET
, "ENONET");
1367 set_syserr(ENOPKG
, "ENOPKG");
1370 set_syserr(EREMOTE
, "EREMOTE");
1373 set_syserr(ENOLINK
, "ENOLINK");
1376 set_syserr(EADV
, "EADV");
1379 set_syserr(ESRMNT
, "ESRMNT");
1382 set_syserr(ECOMM
, "ECOMM");
1385 set_syserr(EPROTO
, "EPROTO");
1388 set_syserr(EMULTIHOP
, "EMULTIHOP");
1391 set_syserr(EDOTDOT
, "EDOTDOT");
1394 set_syserr(EBADMSG
, "EBADMSG");
1397 set_syserr(EOVERFLOW
, "EOVERFLOW");
1400 set_syserr(ENOTUNIQ
, "ENOTUNIQ");
1403 set_syserr(EBADFD
, "EBADFD");
1406 set_syserr(EREMCHG
, "EREMCHG");
1409 set_syserr(ELIBACC
, "ELIBACC");
1412 set_syserr(ELIBBAD
, "ELIBBAD");
1415 set_syserr(ELIBSCN
, "ELIBSCN");
1418 set_syserr(ELIBMAX
, "ELIBMAX");
1421 set_syserr(ELIBEXEC
, "ELIBEXEC");
1424 set_syserr(EILSEQ
, "EILSEQ");
1427 set_syserr(ERESTART
, "ERESTART");
1430 set_syserr(ESTRPIPE
, "ESTRPIPE");
1433 set_syserr(EUSERS
, "EUSERS");
1436 set_syserr(ENOTSOCK
, "ENOTSOCK");
1439 set_syserr(EDESTADDRREQ
, "EDESTADDRREQ");
1442 set_syserr(EMSGSIZE
, "EMSGSIZE");
1445 set_syserr(EPROTOTYPE
, "EPROTOTYPE");
1448 set_syserr(ENOPROTOOPT
, "ENOPROTOOPT");
1450 #ifdef EPROTONOSUPPORT
1451 set_syserr(EPROTONOSUPPORT
, "EPROTONOSUPPORT");
1453 #ifdef ESOCKTNOSUPPORT
1454 set_syserr(ESOCKTNOSUPPORT
, "ESOCKTNOSUPPORT");
1457 set_syserr(EOPNOTSUPP
, "EOPNOTSUPP");
1460 set_syserr(EPFNOSUPPORT
, "EPFNOSUPPORT");
1463 set_syserr(EAFNOSUPPORT
, "EAFNOSUPPORT");
1466 set_syserr(EADDRINUSE
, "EADDRINUSE");
1468 #ifdef EADDRNOTAVAIL
1469 set_syserr(EADDRNOTAVAIL
, "EADDRNOTAVAIL");
1472 set_syserr(ENETDOWN
, "ENETDOWN");
1475 set_syserr(ENETUNREACH
, "ENETUNREACH");
1478 set_syserr(ENETRESET
, "ENETRESET");
1481 set_syserr(ECONNABORTED
, "ECONNABORTED");
1484 set_syserr(ECONNRESET
, "ECONNRESET");
1487 set_syserr(ENOBUFS
, "ENOBUFS");
1490 set_syserr(EISCONN
, "EISCONN");
1493 set_syserr(ENOTCONN
, "ENOTCONN");
1496 set_syserr(ESHUTDOWN
, "ESHUTDOWN");
1499 set_syserr(ETOOMANYREFS
, "ETOOMANYREFS");
1502 set_syserr(ETIMEDOUT
, "ETIMEDOUT");
1505 set_syserr(ECONNREFUSED
, "ECONNREFUSED");
1508 set_syserr(EHOSTDOWN
, "EHOSTDOWN");
1511 set_syserr(EHOSTUNREACH
, "EHOSTUNREACH");
1514 set_syserr(EALREADY
, "EALREADY");
1517 set_syserr(EINPROGRESS
, "EINPROGRESS");
1520 set_syserr(ESTALE
, "ESTALE");
1523 set_syserr(EUCLEAN
, "EUCLEAN");
1526 set_syserr(ENOTNAM
, "ENOTNAM");
1529 set_syserr(ENAVAIL
, "ENAVAIL");
1532 set_syserr(EISNAM
, "EISNAM");
1535 set_syserr(EREMOTEIO
, "EREMOTEIO");
1538 set_syserr(EDQUOT
, "EDQUOT");
1540 rb_eNOERROR
= set_syserr(0, "NOERROR");
1544 err_append(const char *s
)
1546 rb_thread_t
*th
= GET_THREAD();
1547 VALUE err
= th
->errinfo
;
1549 if (th
->mild_compile_error
) {
1551 err
= rb_exc_new2(rb_eSyntaxError
, s
);
1555 VALUE str
= rb_obj_as_string(err
);
1557 rb_str_cat2(str
, "\n");
1558 rb_str_cat2(str
, s
);
1559 th
->errinfo
= rb_exc_new3(rb_eSyntaxError
, str
);
1564 err
= rb_exc_new2(rb_eSyntaxError
, "compile error");
1568 rb_write_error("\n");