aboutsummaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/eval.c b/eval.c
index b4a30e35aa..68db0ed335 100644
--- a/eval.c
+++ b/eval.c
@@ -311,7 +311,7 @@ remove_method(klass, mid)
rb_raise(rb_eSecurityError, "Insecure: can't remove method");
}
if (OBJ_FROZEN(klass)) rb_error_frozen("class/module");
- if (!st_delete(RCLASS(klass)->m_tbl, &mid, &body)) {
+ if (!st_delete(RCLASS(klass)->m_tbl, &mid, &body) || !body->nd_body) {
rb_name_error(mid, "method `%s' not defined in %s",
rb_id2name(mid), rb_class2name(klass));
}
@@ -3301,14 +3301,25 @@ rb_eval(self, n)
{
VALUE klass;
- klass = rb_eval(self, node->nd_recv);
- if (rb_special_const_p(klass)) {
- rb_raise(rb_eTypeError, "no virtual class for %s",
- rb_class2name(CLASS_OF(klass)));
+ result = rb_eval(self, node->nd_recv);
+ if (result == Qtrue) {
+ klass = rb_cTrueClass;
+ }
+ else if (result == Qfalse) {
+ klass = rb_cTrueClass;
+ }
+ else if (result == Qnil) {
+ klass = rb_cNilClass;
+ }
+ else {
+ if (rb_special_const_p(result)) {
+ rb_raise(rb_eTypeError, "no virtual class for %s",
+ rb_class2name(CLASS_OF(klass)));
+ }
+ if (rb_safe_level() >= 4 && !OBJ_TAINTED(result))
+ rb_raise(rb_eSecurityError, "Insecure: can't extend object");
+ klass = rb_singleton_class(result);
}
- if (rb_safe_level() >= 4 && !OBJ_TAINTED(klass))
- rb_raise(rb_eSecurityError, "Insecure: can't extend object");
- klass = rb_singleton_class(klass);
if (ruby_wrapper) {
rb_extend_object(klass, ruby_wrapper);