Skip to content

Commit 7f425b2

Browse files
committed
* eval.c (rb_f_missing): create exception instance by ordinal
method. * error.c (rb_name_error, rb_sys_fail): ditto. * error.c (exc_to_s, exit_status, name_err_name, nometh_err_args, syserr_errno, syserr_eqq): access attributes. * error.c (name_err_initialize, nometh_err_initialize, syserr_initialize): initialize attributes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3831 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 340e508 commit 7f425b2

File tree

3 files changed

+100
-36
lines changed

3 files changed

+100
-36
lines changed

ChangeLog

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
Tue May 20 10:51:26 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
2+
3+
* eval.c (rb_f_missing): create exception instance by ordinal
4+
method.
5+
6+
* error.c (rb_name_error, rb_sys_fail): ditto.
7+
8+
* error.c (exc_to_s, exit_status, name_err_name,
9+
nometh_err_args, syserr_errno, syserr_eqq): access
10+
attributes.
11+
12+
* error.c (name_err_initialize, nometh_err_initialize,
13+
syserr_initialize): initialize attributes.
14+
115
Mon May 19 18:54:30 2003 why the lucky stiff <ruby-cvs@whytheluckystiff.net>
216

317
* lib/token.c, lib/implicit.c: expanded character set to allow UTF-8,

error.c

Lines changed: 78 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ static VALUE
331331
exc_to_s(exc)
332332
VALUE exc;
333333
{
334-
VALUE mesg = rb_iv_get(exc, "mesg");
334+
VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));
335335

336336
if (NIL_P(mesg)) return rb_class_path(CLASS_OF(exc));
337337
if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
@@ -421,7 +421,7 @@ static VALUE
421421
exit_status(exc)
422422
VALUE exc;
423423
{
424-
return rb_iv_get(exc, "status");
424+
return rb_attr_get(exc, rb_intern("status"));
425425
}
426426

427427
void
@@ -434,31 +434,56 @@ rb_name_error(id, fmt, va_alist)
434434
va_dcl
435435
#endif
436436
{
437-
VALUE exc;
438-
437+
VALUE exc, argv[2];
439438
va_list args;
440439
char buf[BUFSIZ];
441440

442441
va_init_list(args, fmt);
443442
vsnprintf(buf, BUFSIZ, fmt, args);
444443
va_end(args);
445-
exc = rb_exc_new2(rb_eNameError, buf);
446-
rb_iv_set(exc, "name", ID2SYM(id));
444+
445+
argv[0] = rb_str_new2(buf);
446+
argv[1] = ID2SYM(id);
447+
exc = rb_class_new_instance(2, argv, rb_eNameError);
447448
rb_exc_raise(exc);
448449
}
449450

451+
static VALUE
452+
name_err_initialize(argc, argv, self)
453+
int argc;
454+
VALUE *argv;
455+
VALUE self;
456+
{
457+
VALUE name = (argc > 1) ? argv[--argc] : Qnil;
458+
exc_initialize(argc, argv, self);
459+
rb_iv_set(self, "name", name);
460+
return self;
461+
}
462+
450463
static VALUE
451464
name_err_name(self)
452465
VALUE self;
453466
{
454-
return rb_iv_get(self, "name");
467+
return rb_attr_get(self, rb_intern("name"));
468+
}
469+
470+
static VALUE
471+
nometh_err_initialize(argc, argv, self)
472+
int argc;
473+
VALUE *argv;
474+
VALUE self;
475+
{
476+
VALUE args = (argc > 2) ? argv[--argc] : Qnil;
477+
name_err_initialize(argc, argv, self);
478+
rb_iv_set(self, "args", args);
479+
return self;
455480
}
456481

457482
static VALUE
458483
nometh_err_args(self)
459484
VALUE self;
460485
{
461-
return rb_iv_get(self, "args");
486+
return rb_attr_get(self, rb_intern("args"));
462487
}
463488

464489
void
@@ -505,11 +530,45 @@ get_syserr(n)
505530
return error;
506531
}
507532

533+
static VALUE
534+
syserr_initialize(argc, argv, self)
535+
int argc;
536+
VALUE *argv;
537+
VALUE self;
538+
{
539+
#if !defined(_WIN32) && !defined(__VMS)
540+
char *strerror();
541+
#endif
542+
char *err;
543+
char *buf;
544+
VALUE error, mesg;
545+
546+
if (rb_scan_args(argc, argv, "11", &mesg, &error) == 1 && FIXNUM_P(mesg)) {
547+
error = mesg;
548+
mesg = Qnil;
549+
}
550+
err = strerror(NUM2LONG(error));
551+
if (!err) err = "Unknown error";
552+
if (RTEST(mesg)) {
553+
StringValue(mesg);
554+
buf = ALLOCA_N(char, strlen(err)+RSTRING(mesg)->len+4);
555+
sprintf(buf, "%s - %s", err, RSTRING(mesg)->ptr);
556+
mesg = rb_str_new2(buf);
557+
}
558+
else {
559+
mesg = rb_str_new2(err);
560+
}
561+
562+
exc_initialize(1, &mesg, self);
563+
rb_iv_set(self, "errno", error);
564+
return self;
565+
}
566+
508567
static VALUE
509568
syserr_errno(self)
510569
VALUE self;
511570
{
512-
return rb_iv_get(self, "errno");
571+
return rb_attr_get(self, rb_intern("errno"));
513572
}
514573

515574
static VALUE
@@ -521,7 +580,7 @@ syserr_eqq(self, exc)
521580
if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse;
522581
if (self == rb_eSystemCallError) return Qtrue;
523582

524-
num = rb_iv_get(exc, "errno");
583+
num = rb_attr_get(exc, rb_intern("errno"));
525584
if (NIL_P(num)) {
526585
VALUE klass = CLASS_OF(exc);
527586

@@ -565,8 +624,10 @@ Init_Exception()
565624
rb_eIndexError = rb_define_class("IndexError", rb_eStandardError);
566625
rb_eRangeError = rb_define_class("RangeError", rb_eStandardError);
567626
rb_eNameError = rb_define_class("NameError", rb_eStandardError);
627+
rb_define_method(rb_eNameError, "initialize", name_err_initialize, -1);
568628
rb_define_method(rb_eNameError, "name", name_err_name, 0);
569629
rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError);
630+
rb_define_method(rb_eNoMethodError, "initialize", nometh_err_initialize, -1);
570631
rb_define_method(rb_eNoMethodError, "args", nometh_err_args, 0);
571632

572633
rb_eScriptError = rb_define_class("ScriptError", rb_eException);
@@ -651,35 +712,18 @@ void
651712
rb_sys_fail(mesg)
652713
const char *mesg;
653714
{
654-
#if !defined(_WIN32) && !defined(__VMS)
655-
char *strerror();
656-
#endif
657-
char *err;
658-
char *buf;
659715
extern int errno;
660716
int n = errno;
661-
VALUE ee;
717+
VALUE argv[2];
662718

663-
if (errno == 0) {
719+
errno = 0;
720+
if (n == 0) {
664721
rb_bug("rb_sys_fail() - errno == 0");
665722
}
666723

667-
err = strerror(errno);
668-
if (mesg) {
669-
volatile VALUE tmp = rb_str_inspect(rb_str_new2(mesg));
670-
671-
buf = ALLOCA_N(char, strlen(err)+RSTRING(tmp)->len+4);
672-
sprintf(buf, "%s - %s", err, RSTRING(tmp)->ptr);
673-
}
674-
else {
675-
buf = ALLOCA_N(char, strlen(err)+1);
676-
strcpy(buf, err);
677-
}
678-
679-
errno = 0;
680-
ee = rb_exc_new2(get_syserr(n), buf);
681-
rb_iv_set(ee, "errno", INT2NUM(n));
682-
rb_exc_raise(ee);
724+
argv[0] = mesg ? rb_str_new2(mesg) : Qnil;
725+
argv[1] = INT2NUM(n);
726+
rb_exc_raise(rb_class_new_instance(2, argv, get_syserr(n)));
683727
}
684728

685729
void
@@ -734,6 +778,7 @@ init_syserr()
734778
{
735779
syserr_tbl = st_init_numtable();
736780
rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError);
781+
rb_define_method(rb_eSystemCallError, "initialize", syserr_initialize, -1);
737782
rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0);
738783
rb_define_singleton_method(rb_eSystemCallError, "===", syserr_eqq, 1);
739784

eval.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4599,13 +4599,18 @@ rb_f_missing(argc, argv, obj)
45994599
{
46004600
char buf[BUFSIZ];
46014601
int noclass = (!d || desc[0]=='#');
4602+
int n = 0;
4603+
VALUE args[3];
46024604

46034605
snprintf(buf, BUFSIZ, format, rb_id2name(id),
46044606
desc, noclass ? "" : ":",
46054607
noclass ? "" : rb_obj_classname(obj));
4606-
exc = rb_exc_new2(exc, buf);
4607-
rb_iv_set(exc, "name", argv[0]);
4608-
rb_iv_set(exc, "args", rb_ary_new4(argc-1, argv+1));
4608+
args[n++] = rb_str_new2(buf);
4609+
args[n++] = argv[0];
4610+
if (exc == rb_eNoMethodError) {
4611+
args[n++] = rb_ary_new4(argc-1, argv+1);
4612+
}
4613+
exc = rb_class_new_instance(n, args, exc);
46094614
rb_exc_raise(exc);
46104615
}
46114616
POP_FRAME();

0 commit comments

Comments
 (0)