diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-25 00:36:56 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-25 00:36:56 +0000 |
commit | b6beb8d943761fe1d754ba4de5ba360018b8e767 (patch) | |
tree | c85f5e2c5f57e0d24b6636c24cb70cb3f6027acd /eval.c | |
parent | beb00bc582c0cbe6feb688026e469f824ee7ea44 (diff) |
* 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
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -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; } |