diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-10 08:23:13 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-10 08:23:13 +0000 |
commit | ae3241dcfe7ffd81766e179bb306b00c8764a312 (patch) | |
tree | 9610f1fec309db355e36aa806e92df7a479fa28f /eval.c | |
parent | 4b9e46d95d76b96fa9dd9fa093c81dc079a8b714 (diff) | |
download | ruby-ae3241dcfe7ffd81766e179bb306b00c8764a312.tar.gz |
* 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
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -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]); |