From ae3241dcfe7ffd81766e179bb306b00c8764a312 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 10 May 2004 08:23:13 +0000 Subject: * eval.c (eval): warning during eval should not cause deadlock. [ruby-talk:98651] * eval.c (rb_eval): raise TypeError exception for superclass mismatch. [ruby-dev:39567] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6288 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ eval.c | 9 ++++++--- intern.h | 2 +- numeric.c | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9194babf0b..5d195c1af6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Mon May 10 16:45:21 2004 Yukihiro Matsumoto + + * eval.c (eval): warning during eval should not cause deadlock. + [ruby-talk:98651] + + * eval.c (rb_eval): raise TypeError exception for superclass + mismatch. [ruby-dev:39567] + Mon May 10 12:11:37 2004 Dave Thomas * lib/rdoc/generators/html_generator.rb: Hack to search parents diff --git a/eval.c b/eval.c index faff5e4442..56adf06171 100644 --- a/eval.c +++ b/eval.c @@ -3791,7 +3791,8 @@ rb_eval(self, n) if (super) { tmp = rb_class_real(RCLASS(klass)->super); if (tmp != super) { - goto override_class; + rb_raise(rb_eTypeError, "superclass mismatch for class %s", + rb_id2name(cname)); } super = 0; } @@ -3800,7 +3801,6 @@ rb_eval(self, n) } } else { - override_class: if (!super) super = rb_cObject; klass = rb_define_class_id(cname, super); rb_set_class_path(klass, cbase, rb_id2name(cname)); @@ -6011,6 +6011,7 @@ eval(self, src, scope, file, line) struct FRAME frame; NODE *nodesave = ruby_current_node; volatile int iter = ruby_frame->iter; + volatile int safe = ruby_safe_level; int state; if (!NIL_P(scope)) { @@ -6064,6 +6065,7 @@ eval(self, src, scope, file, line) if ((state = EXEC_TAG()) == 0) { NODE *node; + ruby_safe_level = 0; result = ruby_errinfo; ruby_errinfo = Qnil; node = compile(src, file, line); @@ -6076,6 +6078,7 @@ eval(self, src, scope, file, line) POP_TAG(); POP_CLASS(); ruby_in_eval--; + ruby_safe_level = safe; if (!NIL_P(scope)) { int dont_recycle = ruby_scope->flags & SCOPE_DONT_RECYCLE; @@ -6112,7 +6115,7 @@ eval(self, src, scope, file, line) errat = get_backtrace(ruby_errinfo); mesg = rb_attr_get(ruby_errinfo, rb_intern("mesg")); - if (!NIL_P(errat) && TYPE(errat) == T_ARRAY) { + if (!NIL_P(errat) && TYPE(errat) == T_ARRAY) { if (!NIL_P(mesg) && TYPE(mesg) == T_STRING) { rb_str_update(mesg, 0, 0, rb_str_new2(": ")); rb_str_update(mesg, 0, 0, RARRAY(errat)->ptr[0]); diff --git a/intern.h b/intern.h index 6575a61cad..74c36d8fe5 100644 --- a/intern.h +++ b/intern.h @@ -218,7 +218,7 @@ void rb_thread_interrupt _((void)); void rb_thread_trap_eval _((VALUE, int)); void rb_thread_signal_raise _((char*)); int rb_thread_select _((int, fd_set *, fd_set *, fd_set *, struct timeval *)); -void rb_thread_wait_for _((struct timeval time)); +void rb_thread_wait_for _((struct timeval)); VALUE rb_thread_current _((void)); VALUE rb_thread_main _((void)); VALUE rb_thread_local_aref _((VALUE, ID)); diff --git a/numeric.c b/numeric.c index f7439ec34b..e3afca6ee3 100644 --- a/numeric.c +++ b/numeric.c @@ -502,7 +502,7 @@ flo_to_s(flt) avalue = fabs(value); if (avalue < 1.0e-7 || avalue >= 1.0e15) { - fmt = "%.16e"; + fmt = "%.15e"; } sprintf(buf, fmt, value); if (!(e = strchr(buf, 'e'))) { -- cgit v1.2.3