00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "ruby.h"
00014 #include "env.h"
00015 #include "st.h"
00016
00017 #include <stdio.h>
00018 #ifdef HAVE_STDARG_PROTOTYPES
00019 #include <stdarg.h>
00020 #define va_init_list(a,b) va_start(a,b)
00021 #else
00022 #include <varargs.h>
00023 #define va_init_list(a,b) va_start(a)
00024 #endif
00025 #ifdef HAVE_STDLIB_H
00026 #include <stdlib.h>
00027 #endif
00028 #ifndef EXIT_SUCCESS
00029 #define EXIT_SUCCESS 0
00030 #endif
00031
00032 extern const char ruby_version[], ruby_release_date[], ruby_platform[];
00033
00034 int ruby_nerrs;
00035
00036 static int
00037 err_position(buf, len)
00038 char *buf;
00039 long len;
00040 {
00041 ruby_set_current_source();
00042 if (!ruby_sourcefile) {
00043 return 0;
00044 }
00045 else if (ruby_sourceline == 0) {
00046 return snprintf(buf, len, "%s: ", ruby_sourcefile);
00047 }
00048 else {
00049 return snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
00050 }
00051 }
00052
00053 static void
00054 err_snprintf(buf, len, fmt, args)
00055 char *buf;
00056 long len;
00057 const char *fmt;
00058 va_list args;
00059 {
00060 long n;
00061
00062 n = err_position(buf, len);
00063 if (len > n) {
00064 vsnprintf((char*)buf+n, len-n, fmt, args);
00065 }
00066 }
00067
00068 static void err_append (const char*);
00069 static void
00070 err_print(fmt, args)
00071 const char *fmt;
00072 va_list args;
00073 {
00074 char buf[BUFSIZ];
00075
00076 err_snprintf(buf, BUFSIZ, fmt, args);
00077 err_append(buf);
00078 }
00079
00080 void
00081 #ifdef HAVE_STDARG_PROTOTYPES
00082 rb_compile_error(const char *fmt, ...)
00083 #else
00084 rb_compile_error(fmt, va_alist)
00085 const char *fmt;
00086 va_dcl
00087 #endif
00088 {
00089 va_list args;
00090
00091 va_init_list(args, fmt);
00092 err_print(fmt, args);
00093 va_end(args);
00094 ruby_nerrs++;
00095 }
00096
00097 void
00098 #ifdef HAVE_STDARG_PROTOTYPES
00099 rb_compile_error_append(const char *fmt, ...)
00100 #else
00101 rb_compile_error_append(fmt, va_alist)
00102 const char *fmt;
00103 va_dcl
00104 #endif
00105 {
00106 va_list args;
00107 char buf[BUFSIZ];
00108
00109 va_init_list(args, fmt);
00110 vsnprintf(buf, BUFSIZ, fmt, args);
00111 va_end(args);
00112 err_append(buf);
00113 }
00114
00115 static void
00116 warn_print(fmt, args)
00117 const char *fmt;
00118 va_list args;
00119 {
00120 char buf[BUFSIZ];
00121 int len;
00122
00123 err_snprintf(buf, BUFSIZ, fmt, args);
00124 len = strlen(buf);
00125 buf[len++] = '\n';
00126 rb_write_error2(buf, len);
00127 }
00128
00129 void
00130 #ifdef HAVE_STDARG_PROTOTYPES
00131 rb_warn(const char *fmt, ...)
00132 #else
00133 rb_warn(fmt, va_alist)
00134 const char *fmt;
00135 va_dcl
00136 #endif
00137 {
00138 char buf[BUFSIZ];
00139 va_list args;
00140
00141 if (NIL_P(ruby_verbose)) return;
00142
00143 snprintf(buf, BUFSIZ, "warning: %s", fmt);
00144
00145 va_init_list(args, fmt);
00146 warn_print(buf, args);
00147 va_end(args);
00148 }
00149
00150
00151 void
00152 #ifdef HAVE_STDARG_PROTOTYPES
00153 rb_warning(const char *fmt, ...)
00154 #else
00155 rb_warning(fmt, va_alist)
00156 const char *fmt;
00157 va_dcl
00158 #endif
00159 {
00160 char buf[BUFSIZ];
00161 va_list args;
00162
00163 if (!RTEST(ruby_verbose)) return;
00164
00165 snprintf(buf, BUFSIZ, "warning: %s", fmt);
00166
00167 va_init_list(args, fmt);
00168 warn_print(buf, args);
00169 va_end(args);
00170 }
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 static VALUE
00181 rb_warn_m(self, mesg)
00182 VALUE self, mesg;
00183 {
00184 if (!NIL_P(ruby_verbose)) {
00185 rb_io_write(rb_stderr, mesg);
00186 rb_io_write(rb_stderr, rb_default_rs);
00187 }
00188 return Qnil;
00189 }
00190
00191 void
00192 #ifdef HAVE_STDARG_PROTOTYPES
00193 rb_bug(const char *fmt, ...)
00194 #else
00195 rb_bug(fmt, va_alist)
00196 const char *fmt;
00197 va_dcl
00198 #endif
00199 {
00200 char buf[BUFSIZ];
00201 va_list args;
00202 FILE *out = stderr;
00203 int len = err_position(buf, BUFSIZ);
00204
00205 if (fwrite(buf, 1, len, out) == len ||
00206 fwrite(buf, 1, len, (out = stdout)) == len) {
00207 fputs("[BUG] ", out);
00208 va_init_list(args, fmt);
00209 vfprintf(out, fmt, args);
00210 va_end(args);
00211 fprintf(out, "\nruby %s (%s) [%s]\n\n",
00212 ruby_version, ruby_release_date, ruby_platform);
00213 }
00214 abort();
00215 }
00216
00217 static struct types {
00218 int type;
00219 const char *name;
00220 } builtin_types[] = {
00221 {T_NIL, "nil"},
00222 {T_OBJECT, "Object"},
00223 {T_CLASS, "Class"},
00224 {T_ICLASS, "iClass"},
00225 {T_MODULE, "Module"},
00226 {T_FLOAT, "Float"},
00227 {T_STRING, "String"},
00228 {T_REGEXP, "Regexp"},
00229 {T_ARRAY, "Array"},
00230 {T_FIXNUM, "Fixnum"},
00231 {T_HASH, "Hash"},
00232 {T_STRUCT, "Struct"},
00233 {T_BIGNUM, "Bignum"},
00234 {T_FILE, "File"},
00235 {T_TRUE, "true"},
00236 {T_FALSE, "false"},
00237 {T_SYMBOL, "Symbol"},
00238 {T_DATA, "Data"},
00239 {T_MATCH, "MatchData"},
00240 {T_VARMAP, "Varmap"},
00241 {T_SCOPE, "Scope"},
00242 {T_NODE, "Node"},
00243 {T_UNDEF, "undef"},
00244 {-1, 0}
00245 };
00246
00247 void
00248 rb_check_type(x, t)
00249 VALUE x;
00250 int t;
00251 {
00252 struct types *type = builtin_types;
00253
00254 if (x == Qundef) {
00255 rb_bug("undef leaked to the Ruby space");
00256 }
00257
00258 if (TYPE(x) != t) {
00259 while (type->type >= 0) {
00260 if (type->type == t) {
00261 char *etype;
00262
00263 if (NIL_P(x)) {
00264 etype = "nil";
00265 }
00266 else if (FIXNUM_P(x)) {
00267 etype = "Fixnum";
00268 }
00269 else if (SYMBOL_P(x)) {
00270 etype = "Symbol";
00271 }
00272 else if (rb_special_const_p(x)) {
00273 etype = RSTRING(rb_obj_as_string(x))->ptr;
00274 }
00275 else {
00276 etype = rb_obj_classname(x);
00277 }
00278 rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
00279 etype, type->name);
00280 }
00281 type++;
00282 }
00283 rb_bug("unknown type 0x%x", t);
00284 }
00285 }
00286
00287
00288 #include <errno.h>
00289
00290 VALUE rb_eException;
00291 VALUE rb_eSystemExit;
00292 VALUE rb_eInterrupt;
00293 VALUE rb_eSignal;
00294 VALUE rb_eFatal;
00295 VALUE rb_eStandardError;
00296 VALUE rb_eRuntimeError;
00297 VALUE rb_eTypeError;
00298 VALUE rb_eArgError;
00299 VALUE rb_eIndexError;
00300 VALUE rb_eRangeError;
00301 VALUE rb_eNameError;
00302 VALUE rb_eNoMethodError;
00303 VALUE rb_eSecurityError;
00304 VALUE rb_eNotImpError;
00305 VALUE rb_eNoMemError;
00306 static VALUE rb_cNameErrorMesg;
00307
00308 VALUE rb_eScriptError;
00309 VALUE rb_eSyntaxError;
00310 VALUE rb_eLoadError;
00311
00312 VALUE rb_eSystemCallError;
00313 VALUE rb_mErrno;
00314
00315 VALUE
00316 rb_exc_new(etype, ptr, len)
00317 VALUE etype;
00318 const char *ptr;
00319 long len;
00320 {
00321 return rb_funcall(etype, rb_intern("new"), 1, rb_str_new(ptr, len));
00322 }
00323
00324 VALUE
00325 rb_exc_new2(etype, s)
00326 VALUE etype;
00327 const char *s;
00328 {
00329 return rb_exc_new(etype, s, strlen(s));
00330 }
00331
00332 VALUE
00333 rb_exc_new3(etype, str)
00334 VALUE etype, str;
00335 {
00336 StringValue(str);
00337 return rb_exc_new(etype, RSTRING(str)->ptr, RSTRING(str)->len);
00338 }
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 static VALUE
00349 exc_initialize(argc, argv, exc)
00350 int argc;
00351 VALUE *argv;
00352 VALUE exc;
00353 {
00354 VALUE arg;
00355
00356 rb_scan_args(argc, argv, "01", &arg);
00357 rb_iv_set(exc, "mesg", arg);
00358 rb_iv_set(exc, "bt", Qnil);
00359
00360 return exc;
00361 }
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 static VALUE
00377 exc_exception(argc, argv, self)
00378 int argc;
00379 VALUE *argv;
00380 VALUE self;
00381 {
00382 VALUE exc;
00383
00384 if (argc == 0) return self;
00385 if (argc == 1 && self == argv[0]) return self;
00386 exc = rb_obj_clone(self);
00387 exc_initialize(argc, argv, exc);
00388
00389 return exc;
00390 }
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 static VALUE
00401 exc_to_s(exc)
00402 VALUE exc;
00403 {
00404 VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));
00405
00406 if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
00407 if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
00408 return mesg;
00409 }
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422 static VALUE
00423 exc_to_str(exc)
00424 VALUE exc;
00425 {
00426 return rb_funcall(exc, rb_intern("to_s"), 0, 0);
00427 }
00428
00429
00430
00431
00432
00433
00434
00435
00436 static VALUE
00437 exc_inspect(exc)
00438 VALUE exc;
00439 {
00440 VALUE str, klass;
00441
00442 klass = CLASS_OF(exc);
00443 exc = rb_obj_as_string(exc);
00444 if (RSTRING(exc)->len == 0) {
00445 return rb_str_dup(rb_class_name(klass));
00446 }
00447
00448 str = rb_str_buf_new2("#<");
00449 klass = rb_class_name(klass);
00450 rb_str_buf_append(str, klass);
00451 rb_str_buf_cat(str, ": ", 2);
00452 rb_str_buf_append(str, exc);
00453 rb_str_buf_cat(str, ">", 1);
00454
00455 return str;
00456 }
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 static VALUE
00488 exc_backtrace(exc)
00489 VALUE exc;
00490 {
00491 ID bt = rb_intern("bt");
00492
00493 if (!rb_ivar_defined(exc, bt)) return Qnil;
00494 return rb_ivar_get(exc, bt);
00495 }
00496
00497 static VALUE
00498 check_backtrace(bt)
00499 VALUE bt;
00500 {
00501 long i;
00502 static char *err = "backtrace must be Array of String";
00503
00504 if (!NIL_P(bt)) {
00505 int t = TYPE(bt);
00506
00507 if (t == T_STRING) return rb_ary_new3(1, bt);
00508 if (t != T_ARRAY) {
00509 rb_raise(rb_eTypeError, err);
00510 }
00511 for (i=0;i<RARRAY(bt)->len;i++) {
00512 if (TYPE(RARRAY(bt)->ptr[i]) != T_STRING) {
00513 rb_raise(rb_eTypeError, err);
00514 }
00515 }
00516 }
00517 return bt;
00518 }
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530 static VALUE
00531 exc_set_backtrace(exc, bt)
00532 VALUE exc;
00533 VALUE bt;
00534 {
00535 return rb_iv_set(exc, "bt", check_backtrace(bt));
00536 }
00537
00538
00539
00540
00541
00542
00543
00544
00545 static VALUE
00546 exit_initialize(argc, argv, exc)
00547 int argc;
00548 VALUE *argv;
00549 VALUE exc;
00550 {
00551 VALUE status = INT2FIX(EXIT_SUCCESS);
00552 if (argc > 0 && FIXNUM_P(argv[0])) {
00553 status = *argv++;
00554 --argc;
00555 }
00556 rb_call_super(argc, argv);
00557 rb_iv_set(exc, "status", status);
00558 return exc;
00559 }
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569 static VALUE
00570 exit_status(exc)
00571 VALUE exc;
00572 {
00573 return rb_attr_get(exc, rb_intern("status"));
00574 }
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584 static VALUE
00585 exit_success_p(exc)
00586 VALUE exc;
00587 {
00588 VALUE status = rb_attr_get(exc, rb_intern("status"));
00589 if (NIL_P(status)) return Qtrue;
00590 if (status == INT2FIX(EXIT_SUCCESS)) return Qtrue;
00591 return Qfalse;
00592 }
00593
00594 void
00595 #ifdef HAVE_STDARG_PROTOTYPES
00596 rb_name_error(ID id, const char *fmt, ...)
00597 #else
00598 rb_name_error(id, fmt, va_alist)
00599 ID id;
00600 const char *fmt;
00601 va_dcl
00602 #endif
00603 {
00604 VALUE exc, argv[2];
00605 va_list args;
00606 char buf[BUFSIZ];
00607
00608 va_init_list(args, fmt);
00609 vsnprintf(buf, BUFSIZ, fmt, args);
00610 va_end(args);
00611
00612 argv[0] = rb_str_new2(buf);
00613 argv[1] = ID2SYM(id);
00614 exc = rb_class_new_instance(2, argv, rb_eNameError);
00615 rb_exc_raise(exc);
00616 }
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627 static VALUE
00628 name_err_initialize(argc, argv, self)
00629 int argc;
00630 VALUE *argv;
00631 VALUE self;
00632 {
00633 VALUE name;
00634
00635 name = (argc > 1) ? argv[--argc] : Qnil;
00636 rb_call_super(argc, argv);
00637 rb_iv_set(self, "name", name);
00638 return self;
00639 }
00640
00641
00642
00643
00644
00645
00646
00647
00648 static VALUE
00649 name_err_name(self)
00650 VALUE self;
00651 {
00652 return rb_attr_get(self, rb_intern("name"));
00653 }
00654
00655
00656
00657
00658
00659
00660
00661
00662 static VALUE
00663 name_err_to_s(exc)
00664 VALUE exc;
00665 {
00666 VALUE mesg = rb_attr_get(exc, rb_intern("mesg")), str = mesg;
00667
00668 if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
00669 StringValue(str);
00670 if (str != mesg) {
00671 rb_iv_set(exc, "mesg", mesg = str);
00672 }
00673 if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
00674 return mesg;
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687 static VALUE
00688 nometh_err_initialize(argc, argv, self)
00689 int argc;
00690 VALUE *argv;
00691 VALUE self;
00692 {
00693 VALUE args = (argc > 2) ? argv[--argc] : Qnil;
00694 name_err_initialize(argc, argv, self);
00695 rb_iv_set(self, "args", args);
00696 return self;
00697 }
00698
00699
00700 static void
00701 name_err_mesg_mark(ptr)
00702 VALUE *ptr;
00703 {
00704 rb_gc_mark_locations(ptr, ptr+3);
00705 }
00706
00707
00708 static VALUE
00709 name_err_mesg_new(obj, mesg, recv, method)
00710 VALUE obj, mesg, recv, method;
00711 {
00712 VALUE *ptr = ALLOC_N(VALUE, 3);
00713
00714 ptr[0] = mesg;
00715 ptr[1] = recv;
00716 ptr[2] = method;
00717 return Data_Wrap_Struct(rb_cNameErrorMesg, name_err_mesg_mark, -1, ptr);
00718 }
00719
00720
00721 static VALUE
00722 name_err_mesg_to_str(obj)
00723 VALUE obj;
00724 {
00725 VALUE *ptr, mesg;
00726 Data_Get_Struct(obj, VALUE, ptr);
00727
00728 mesg = ptr[0];
00729 if (NIL_P(mesg)) return Qnil;
00730 else {
00731 char *desc = 0;
00732 VALUE d = 0, args[3];
00733
00734 obj = ptr[1];
00735 switch (TYPE(obj)) {
00736 case T_NIL:
00737 desc = "nil";
00738 break;
00739 case T_TRUE:
00740 desc = "true";
00741 break;
00742 case T_FALSE:
00743 desc = "false";
00744 break;
00745 default:
00746 d = rb_protect(rb_inspect, obj, 0);
00747 if (NIL_P(d) || RSTRING(d)->len > 65) {
00748 d = rb_any_to_s(obj);
00749 }
00750 desc = RSTRING(d)->ptr;
00751 break;
00752 }
00753 if (desc && desc[0] != '#') {
00754 d = rb_str_new2(desc);
00755 rb_str_cat2(d, ":");
00756 rb_str_cat2(d, rb_obj_classname(obj));
00757 }
00758 args[0] = mesg;
00759 args[1] = ptr[2];
00760 args[2] = d;
00761 mesg = rb_f_sprintf(3, args);
00762 }
00763 if (OBJ_TAINTED(obj)) OBJ_TAINT(mesg);
00764 return mesg;
00765 }
00766
00767
00768 static VALUE
00769 name_err_mesg_load(klass, str)
00770 VALUE klass, str;
00771 {
00772 return str;
00773 }
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783 static VALUE
00784 nometh_err_args(self)
00785 VALUE self;
00786 {
00787 return rb_attr_get(self, rb_intern("args"));
00788 }
00789
00790 void
00791 rb_invalid_str(str, type)
00792 const char *str, *type;
00793 {
00794 VALUE s = rb_str_inspect(rb_str_new2(str));
00795
00796 rb_raise(rb_eArgError, "invalid value for %s: %s", type, RSTRING(s)->ptr);
00797 }
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830 static st_table *syserr_tbl;
00831
00832 static VALUE
00833 set_syserr(n, name)
00834 int n;
00835 const char *name;
00836 {
00837 VALUE error;
00838
00839 if (!st_lookup(syserr_tbl, n, &error)) {
00840 error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);
00841 rb_define_const(error, "Errno", INT2NUM(n));
00842 st_add_direct(syserr_tbl, n, error);
00843 }
00844 else {
00845 rb_define_const(rb_mErrno, name, error);
00846 }
00847 return error;
00848 }
00849
00850 static VALUE
00851 get_syserr(n)
00852 int n;
00853 {
00854 VALUE error;
00855
00856 if (!st_lookup(syserr_tbl, n, &error)) {
00857 char name[8];
00858
00859 snprintf(name, sizeof(name), "E%03d", n);
00860 error = set_syserr(n, name);
00861 }
00862 return error;
00863 }
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876 static VALUE
00877 syserr_initialize(argc, argv, self)
00878 int argc;
00879 VALUE *argv;
00880 VALUE self;
00881 {
00882 #if !defined(_WIN32) && !defined(__VMS)
00883 char *strerror();
00884 #endif
00885 char *err;
00886 VALUE mesg, error;
00887 VALUE klass = rb_obj_class(self);
00888
00889 if (klass == rb_eSystemCallError) {
00890 rb_scan_args(argc, argv, "11", &mesg, &error);
00891 if (argc == 1 && FIXNUM_P(mesg)) {
00892 error = mesg; mesg = Qnil;
00893 }
00894 if (!NIL_P(error) && st_lookup(syserr_tbl, NUM2LONG(error), &klass)) {
00895
00896 if (TYPE(self) != T_OBJECT) {
00897 rb_raise(rb_eTypeError, "invalid instance type");
00898 }
00899 RBASIC(self)->klass = klass;
00900 }
00901 }
00902 else {
00903 rb_scan_args(argc, argv, "01", &mesg);
00904 error = rb_const_get(klass, rb_intern("Errno"));
00905 }
00906 if (!NIL_P(error)) err = strerror(NUM2LONG(error));
00907 else err = "unknown error";
00908 if (!NIL_P(mesg)) {
00909 VALUE str = mesg;
00910 size_t len;
00911
00912 StringValue(str);
00913 len = strlen(err)+RSTRING(str)->len+3;
00914 mesg = rb_str_new(0, len);
00915 snprintf(RSTRING(mesg)->ptr, len+1, "%s - %.*s", err,
00916 (int)RSTRING(str)->len, RSTRING(str)->ptr);
00917 rb_str_resize(mesg, strlen(RSTRING(mesg)->ptr));
00918 }
00919 else {
00920 mesg = rb_str_new2(err);
00921 }
00922 rb_call_super(1, &mesg);
00923 rb_iv_set(self, "errno", error);
00924 return self;
00925 }
00926
00927
00928
00929
00930
00931
00932
00933
00934 static VALUE
00935 syserr_errno(self)
00936 VALUE self;
00937 {
00938 return rb_attr_get(self, rb_intern("errno"));
00939 }
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950 static VALUE
00951 syserr_eqq(self, exc)
00952 VALUE self, exc;
00953 {
00954 VALUE num, e;
00955
00956 if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse;
00957 if (self == rb_eSystemCallError) return Qtrue;
00958
00959 num = rb_attr_get(exc, rb_intern("errno"));
00960 if (NIL_P(num)) {
00961 VALUE klass = CLASS_OF(exc);
00962
00963 while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) {
00964 klass = (VALUE)RCLASS(klass)->super;
00965 }
00966 num = rb_const_get(klass, rb_intern("Errno"));
00967 }
00968 e = rb_const_get(self, rb_intern("Errno"));
00969 if (FIXNUM_P(num) ? num == e : rb_equal(num, e))
00970 return Qtrue;
00971 return Qfalse;
00972 }
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984 void
00985 Init_Exception()
00986 {
00987 rb_eException = rb_define_class("Exception", rb_cObject);
00988 rb_define_singleton_method(rb_eException, "exception", rb_class_new_instance, -1);
00989 rb_define_method(rb_eException, "exception", exc_exception, -1);
00990 rb_define_method(rb_eException, "initialize", exc_initialize, -1);
00991 rb_define_method(rb_eException, "to_s", exc_to_s, 0);
00992 rb_define_method(rb_eException, "to_str", exc_to_str, 0);
00993 rb_define_method(rb_eException, "message", exc_to_str, 0);
00994 rb_define_method(rb_eException, "inspect", exc_inspect, 0);
00995 rb_define_method(rb_eException, "backtrace", exc_backtrace, 0);
00996 rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1);
00997
00998 rb_eSystemExit = rb_define_class("SystemExit", rb_eException);
00999 rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1);
01000 rb_define_method(rb_eSystemExit, "status", exit_status, 0);
01001 rb_define_method(rb_eSystemExit, "success?", exit_success_p, 0);
01002
01003 rb_eFatal = rb_define_class("fatal", rb_eException);
01004 rb_eSignal = rb_define_class("SignalException", rb_eException);
01005 rb_eInterrupt = rb_define_class("Interrupt", rb_eSignal);
01006
01007 rb_eStandardError = rb_define_class("StandardError", rb_eException);
01008 rb_eTypeError = rb_define_class("TypeError", rb_eStandardError);
01009 rb_eArgError = rb_define_class("ArgumentError", rb_eStandardError);
01010 rb_eIndexError = rb_define_class("IndexError", rb_eStandardError);
01011 rb_eRangeError = rb_define_class("RangeError", rb_eStandardError);
01012 rb_eNameError = rb_define_class("NameError", rb_eStandardError);
01013 rb_define_method(rb_eNameError, "initialize", name_err_initialize, -1);
01014 rb_define_method(rb_eNameError, "name", name_err_name, 0);
01015 rb_define_method(rb_eNameError, "to_s", name_err_to_s, 0);
01016 rb_cNameErrorMesg = rb_define_class_under(rb_eNameError, "message", rb_cData);
01017 rb_define_singleton_method(rb_cNameErrorMesg, "!", name_err_mesg_new, 3);
01018 rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0);
01019 rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_to_str, 1);
01020 rb_define_singleton_method(rb_cNameErrorMesg, "_load", name_err_mesg_load, 1);
01021 rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError);
01022 rb_define_method(rb_eNoMethodError, "initialize", nometh_err_initialize, -1);
01023 rb_define_method(rb_eNoMethodError, "args", nometh_err_args, 0);
01024
01025 rb_eScriptError = rb_define_class("ScriptError", rb_eException);
01026 rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError);
01027 rb_eLoadError = rb_define_class("LoadError", rb_eScriptError);
01028 rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError);
01029
01030 rb_eRuntimeError = rb_define_class("RuntimeError", rb_eStandardError);
01031 rb_eSecurityError = rb_define_class("SecurityError", rb_eStandardError);
01032 rb_eNoMemError = rb_define_class("NoMemoryError", rb_eException);
01033
01034 syserr_tbl = st_init_numtable();
01035 rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError);
01036 rb_define_method(rb_eSystemCallError, "initialize", syserr_initialize, -1);
01037 rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0);
01038 rb_define_singleton_method(rb_eSystemCallError, "===", syserr_eqq, 1);
01039
01040 rb_mErrno = rb_define_module("Errno");
01041
01042 rb_define_global_function("warn", rb_warn_m, 1);
01043 }
01044
01045 void
01046 #ifdef HAVE_STDARG_PROTOTYPES
01047 rb_raise(VALUE exc, const char *fmt, ...)
01048 #else
01049 rb_raise(exc, fmt, va_alist)
01050 VALUE exc;
01051 const char *fmt;
01052 va_dcl
01053 #endif
01054 {
01055 va_list args;
01056 char buf[BUFSIZ];
01057
01058 va_init_list(args,fmt);
01059 vsnprintf(buf, BUFSIZ, fmt, args);
01060 va_end(args);
01061 rb_exc_raise(rb_exc_new2(exc, buf));
01062 }
01063
01064 void
01065 #ifdef HAVE_STDARG_PROTOTYPES
01066 rb_loaderror(const char *fmt, ...)
01067 #else
01068 rb_loaderror(fmt, va_alist)
01069 const char *fmt;
01070 va_dcl
01071 #endif
01072 {
01073 va_list args;
01074 char buf[BUFSIZ];
01075
01076 va_init_list(args, fmt);
01077 vsnprintf(buf, BUFSIZ, fmt, args);
01078 va_end(args);
01079 rb_exc_raise(rb_exc_new2(rb_eLoadError, buf));
01080 }
01081
01082 void
01083 rb_notimplement()
01084 {
01085 rb_raise(rb_eNotImpError,
01086 "the %s() function is unimplemented on this machine",
01087 rb_id2name(ruby_frame->last_func));
01088 }
01089
01090 void
01091 #ifdef HAVE_STDARG_PROTOTYPES
01092 rb_fatal(const char *fmt, ...)
01093 #else
01094 rb_fatal(fmt, va_alist)
01095 const char *fmt;
01096 va_dcl
01097 #endif
01098 {
01099 va_list args;
01100 char buf[BUFSIZ];
01101
01102 va_init_list(args, fmt);
01103 vsnprintf(buf, BUFSIZ, fmt, args);
01104 va_end(args);
01105
01106 ruby_in_eval = 0;
01107 rb_exc_fatal(rb_exc_new2(rb_eFatal, buf));
01108 }
01109
01110 void
01111 rb_sys_fail(mesg)
01112 const char *mesg;
01113 {
01114 int n = errno;
01115 VALUE arg;
01116
01117 errno = 0;
01118 if (n == 0) {
01119 rb_bug("rb_sys_fail(%s) - errno == 0", mesg ? mesg : "");
01120 }
01121
01122 arg = mesg ? rb_str_new2(mesg) : Qnil;
01123 rb_exc_raise(rb_class_new_instance(1, &arg, get_syserr(n)));
01124 }
01125
01126 void
01127 #ifdef HAVE_STDARG_PROTOTYPES
01128 rb_sys_warning(const char *fmt, ...)
01129 #else
01130 rb_sys_warning(fmt, va_alist)
01131 const char *fmt;
01132 va_dcl
01133 #endif
01134 {
01135 char buf[BUFSIZ];
01136 va_list args;
01137 int errno_save;
01138
01139 errno_save = errno;
01140
01141 if (!RTEST(ruby_verbose)) return;
01142
01143 snprintf(buf, BUFSIZ, "warning: %s", fmt);
01144 snprintf(buf+strlen(buf), BUFSIZ-strlen(buf), ": %s", strerror(errno_save));
01145
01146 va_init_list(args, fmt);
01147 warn_print(buf, args);
01148 va_end(args);
01149 errno = errno_save;
01150 }
01151
01152 void
01153 rb_load_fail(path)
01154 const char *path;
01155 {
01156 rb_loaderror("%s -- %s", strerror(errno), path);
01157 }
01158
01159 void
01160 rb_error_frozen(what)
01161 const char *what;
01162 {
01163 rb_raise(rb_eTypeError, "can't modify frozen %s", what);
01164 }
01165
01166 void
01167 rb_check_frozen(obj)
01168 VALUE obj;
01169 {
01170 if (OBJ_FROZEN(obj)) rb_error_frozen(rb_obj_classname(obj));
01171 }
01172
01173 void
01174 Init_syserr()
01175 {
01176 #ifdef EPERM
01177 set_syserr(EPERM, "EPERM");
01178 #endif
01179 #ifdef ENOENT
01180 set_syserr(ENOENT, "ENOENT");
01181 #endif
01182 #ifdef ESRCH
01183 set_syserr(ESRCH, "ESRCH");
01184 #endif
01185 #ifdef EINTR
01186 set_syserr(EINTR, "EINTR");
01187 #endif
01188 #ifdef EIO
01189 set_syserr(EIO, "EIO");
01190 #endif
01191 #ifdef ENXIO
01192 set_syserr(ENXIO, "ENXIO");
01193 #endif
01194 #ifdef E2BIG
01195 set_syserr(E2BIG, "E2BIG");
01196 #endif
01197 #ifdef ENOEXEC
01198 set_syserr(ENOEXEC, "ENOEXEC");
01199 #endif
01200 #ifdef EBADF
01201 set_syserr(EBADF, "EBADF");
01202 #endif
01203 #ifdef ECHILD
01204 set_syserr(ECHILD, "ECHILD");
01205 #endif
01206 #ifdef EAGAIN
01207 set_syserr(EAGAIN, "EAGAIN");
01208 #endif
01209 #ifdef ENOMEM
01210 set_syserr(ENOMEM, "ENOMEM");
01211 #endif
01212 #ifdef EACCES
01213 set_syserr(EACCES, "EACCES");
01214 #endif
01215 #ifdef EFAULT
01216 set_syserr(EFAULT, "EFAULT");
01217 #endif
01218 #ifdef ENOTBLK
01219 set_syserr(ENOTBLK, "ENOTBLK");
01220 #endif
01221 #ifdef EBUSY
01222 set_syserr(EBUSY, "EBUSY");
01223 #endif
01224 #ifdef EEXIST
01225 set_syserr(EEXIST, "EEXIST");
01226 #endif
01227 #ifdef EXDEV
01228 set_syserr(EXDEV, "EXDEV");
01229 #endif
01230 #ifdef ENODEV
01231 set_syserr(ENODEV, "ENODEV");
01232 #endif
01233 #ifdef ENOTDIR
01234 set_syserr(ENOTDIR, "ENOTDIR");
01235 #endif
01236 #ifdef EISDIR
01237 set_syserr(EISDIR, "EISDIR");
01238 #endif
01239 #ifdef EINVAL
01240 set_syserr(EINVAL, "EINVAL");
01241 #endif
01242 #ifdef ENFILE
01243 set_syserr(ENFILE, "ENFILE");
01244 #endif
01245 #ifdef EMFILE
01246 set_syserr(EMFILE, "EMFILE");
01247 #endif
01248 #ifdef ENOTTY
01249 set_syserr(ENOTTY, "ENOTTY");
01250 #endif
01251 #ifdef ETXTBSY
01252 set_syserr(ETXTBSY, "ETXTBSY");
01253 #endif
01254 #ifdef EFBIG
01255 set_syserr(EFBIG, "EFBIG");
01256 #endif
01257 #ifdef ENOSPC
01258 set_syserr(ENOSPC, "ENOSPC");
01259 #endif
01260 #ifdef ESPIPE
01261 set_syserr(ESPIPE, "ESPIPE");
01262 #endif
01263 #ifdef EROFS
01264 set_syserr(EROFS, "EROFS");
01265 #endif
01266 #ifdef EMLINK
01267 set_syserr(EMLINK, "EMLINK");
01268 #endif
01269 #ifdef EPIPE
01270 set_syserr(EPIPE, "EPIPE");
01271 #endif
01272 #ifdef EDOM
01273 set_syserr(EDOM, "EDOM");
01274 #endif
01275 #ifdef ERANGE
01276 set_syserr(ERANGE, "ERANGE");
01277 #endif
01278 #ifdef EDEADLK
01279 set_syserr(EDEADLK, "EDEADLK");
01280 #endif
01281 #ifdef ENAMETOOLONG
01282 set_syserr(ENAMETOOLONG, "ENAMETOOLONG");
01283 #endif
01284 #ifdef ENOLCK
01285 set_syserr(ENOLCK, "ENOLCK");
01286 #endif
01287 #ifdef ENOSYS
01288 set_syserr(ENOSYS, "ENOSYS");
01289 #endif
01290 #ifdef ENOTEMPTY
01291 set_syserr(ENOTEMPTY, "ENOTEMPTY");
01292 #endif
01293 #ifdef ELOOP
01294 set_syserr(ELOOP, "ELOOP");
01295 #endif
01296 #ifdef EWOULDBLOCK
01297 set_syserr(EWOULDBLOCK, "EWOULDBLOCK");
01298 #endif
01299 #ifdef ENOMSG
01300 set_syserr(ENOMSG, "ENOMSG");
01301 #endif
01302 #ifdef EIDRM
01303 set_syserr(EIDRM, "EIDRM");
01304 #endif
01305 #ifdef ECHRNG
01306 set_syserr(ECHRNG, "ECHRNG");
01307 #endif
01308 #ifdef EL2NSYNC
01309 set_syserr(EL2NSYNC, "EL2NSYNC");
01310 #endif
01311 #ifdef EL3HLT
01312 set_syserr(EL3HLT, "EL3HLT");
01313 #endif
01314 #ifdef EL3RST
01315 set_syserr(EL3RST, "EL3RST");
01316 #endif
01317 #ifdef ELNRNG
01318 set_syserr(ELNRNG, "ELNRNG");
01319 #endif
01320 #ifdef EUNATCH
01321 set_syserr(EUNATCH, "EUNATCH");
01322 #endif
01323 #ifdef ENOCSI
01324 set_syserr(ENOCSI, "ENOCSI");
01325 #endif
01326 #ifdef EL2HLT
01327 set_syserr(EL2HLT, "EL2HLT");
01328 #endif
01329 #ifdef EBADE
01330 set_syserr(EBADE, "EBADE");
01331 #endif
01332 #ifdef EBADR
01333 set_syserr(EBADR, "EBADR");
01334 #endif
01335 #ifdef EXFULL
01336 set_syserr(EXFULL, "EXFULL");
01337 #endif
01338 #ifdef ENOANO
01339 set_syserr(ENOANO, "ENOANO");
01340 #endif
01341 #ifdef EBADRQC
01342 set_syserr(EBADRQC, "EBADRQC");
01343 #endif
01344 #ifdef EBADSLT
01345 set_syserr(EBADSLT, "EBADSLT");
01346 #endif
01347 #ifdef EDEADLOCK
01348 set_syserr(EDEADLOCK, "EDEADLOCK");
01349 #endif
01350 #ifdef EBFONT
01351 set_syserr(EBFONT, "EBFONT");
01352 #endif
01353 #ifdef ENOSTR
01354 set_syserr(ENOSTR, "ENOSTR");
01355 #endif
01356 #ifdef ENODATA
01357 set_syserr(ENODATA, "ENODATA");
01358 #endif
01359 #ifdef ETIME
01360 set_syserr(ETIME, "ETIME");
01361 #endif
01362 #ifdef ENOSR
01363 set_syserr(ENOSR, "ENOSR");
01364 #endif
01365 #ifdef ENONET
01366 set_syserr(ENONET, "ENONET");
01367 #endif
01368 #ifdef ENOPKG
01369 set_syserr(ENOPKG, "ENOPKG");
01370 #endif
01371 #ifdef EREMOTE
01372 set_syserr(EREMOTE, "EREMOTE");
01373 #endif
01374 #ifdef ENOLINK
01375 set_syserr(ENOLINK, "ENOLINK");
01376 #endif
01377 #ifdef EADV
01378 set_syserr(EADV, "EADV");
01379 #endif
01380 #ifdef ESRMNT
01381 set_syserr(ESRMNT, "ESRMNT");
01382 #endif
01383 #ifdef ECOMM
01384 set_syserr(ECOMM, "ECOMM");
01385 #endif
01386 #ifdef EPROTO
01387 set_syserr(EPROTO, "EPROTO");
01388 #endif
01389 #ifdef EMULTIHOP
01390 set_syserr(EMULTIHOP, "EMULTIHOP");
01391 #endif
01392 #ifdef EDOTDOT
01393 set_syserr(EDOTDOT, "EDOTDOT");
01394 #endif
01395 #ifdef EBADMSG
01396 set_syserr(EBADMSG, "EBADMSG");
01397 #endif
01398 #ifdef EOVERFLOW
01399 set_syserr(EOVERFLOW, "EOVERFLOW");
01400 #endif
01401 #ifdef ENOTUNIQ
01402 set_syserr(ENOTUNIQ, "ENOTUNIQ");
01403 #endif
01404 #ifdef EBADFD
01405 set_syserr(EBADFD, "EBADFD");
01406 #endif
01407 #ifdef EREMCHG
01408 set_syserr(EREMCHG, "EREMCHG");
01409 #endif
01410 #ifdef ELIBACC
01411 set_syserr(ELIBACC, "ELIBACC");
01412 #endif
01413 #ifdef ELIBBAD
01414 set_syserr(ELIBBAD, "ELIBBAD");
01415 #endif
01416 #ifdef ELIBSCN
01417 set_syserr(ELIBSCN, "ELIBSCN");
01418 #endif
01419 #ifdef ELIBMAX
01420 set_syserr(ELIBMAX, "ELIBMAX");
01421 #endif
01422 #ifdef ELIBEXEC
01423 set_syserr(ELIBEXEC, "ELIBEXEC");
01424 #endif
01425 #ifdef EILSEQ
01426 set_syserr(EILSEQ, "EILSEQ");
01427 #endif
01428 #ifdef ERESTART
01429 set_syserr(ERESTART, "ERESTART");
01430 #endif
01431 #ifdef ESTRPIPE
01432 set_syserr(ESTRPIPE, "ESTRPIPE");
01433 #endif
01434 #ifdef EUSERS
01435 set_syserr(EUSERS, "EUSERS");
01436 #endif
01437 #ifdef ENOTSOCK
01438 set_syserr(ENOTSOCK, "ENOTSOCK");
01439 #endif
01440 #ifdef EDESTADDRREQ
01441 set_syserr(EDESTADDRREQ, "EDESTADDRREQ");
01442 #endif
01443 #ifdef EMSGSIZE
01444 set_syserr(EMSGSIZE, "EMSGSIZE");
01445 #endif
01446 #ifdef EPROTOTYPE
01447 set_syserr(EPROTOTYPE, "EPROTOTYPE");
01448 #endif
01449 #ifdef ENOPROTOOPT
01450 set_syserr(ENOPROTOOPT, "ENOPROTOOPT");
01451 #endif
01452 #ifdef EPROTONOSUPPORT
01453 set_syserr(EPROTONOSUPPORT, "EPROTONOSUPPORT");
01454 #endif
01455 #ifdef ESOCKTNOSUPPORT
01456 set_syserr(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT");
01457 #endif
01458 #ifdef EOPNOTSUPP
01459 set_syserr(EOPNOTSUPP, "EOPNOTSUPP");
01460 #endif
01461 #ifdef EPFNOSUPPORT
01462 set_syserr(EPFNOSUPPORT, "EPFNOSUPPORT");
01463 #endif
01464 #ifdef EAFNOSUPPORT
01465 set_syserr(EAFNOSUPPORT, "EAFNOSUPPORT");
01466 #endif
01467 #ifdef EADDRINUSE
01468 set_syserr(EADDRINUSE, "EADDRINUSE");
01469 #endif
01470 #ifdef EADDRNOTAVAIL
01471 set_syserr(EADDRNOTAVAIL, "EADDRNOTAVAIL");
01472 #endif
01473 #ifdef ENETDOWN
01474 set_syserr(ENETDOWN, "ENETDOWN");
01475 #endif
01476 #ifdef ENETUNREACH
01477 set_syserr(ENETUNREACH, "ENETUNREACH");
01478 #endif
01479 #ifdef ENETRESET
01480 set_syserr(ENETRESET, "EN