From b6beb8d943761fe1d754ba4de5ba360018b8e767 Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 25 Oct 2003 00:36:56 +0000 Subject: * eval.c (rb_method_missing): protect exception from within "inspect". (ruby-bugs PR#1204) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4841 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 5961e1ec62..06590c0dde 100644 --- a/eval.c +++ b/eval.c @@ -4716,6 +4716,7 @@ rb_method_missing(argc, argv, obj) char *format = 0; char *desc = ""; NODE *cnode = ruby_current_node; + int state; if (argc == 0 || !SYMBOL_P(argv[0])) { rb_raise(rb_eArgError, "no id given"); @@ -4725,6 +4726,7 @@ rb_method_missing(argc, argv, obj) id = SYM2ID(argv[0]); + switch (TYPE(obj)) { case T_NIL: desc = "nil"; @@ -4736,16 +4738,17 @@ rb_method_missing(argc, argv, obj) desc = "false"; break; default: - if (rb_respond_to(obj, rb_intern("inspect"))) + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { d = rb_inspect(obj); - else + } + POP_TAG(); + if (!d || RSTRING(d)->len > 65) { d = rb_any_to_s(obj); + } break; } if (d) { - if (RSTRING(d)->len > 65) { - d = rb_any_to_s(obj); - } desc = RSTRING(d)->ptr; } -- cgit v1.2.3