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 --- eval.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'eval.c') 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]); -- cgit v1.2.3