From f4ff7ccddf1f7090e23234d6cb37c17c617b4cd2 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 19 May 2003 04:52:55 +0000 Subject: * array.c (get_inspect_tbl): check whether inspect_tbl value is a valid array. (ruby-bugs-ja PR#65) * array.c (inspect_ensure,rb_protect_inspect,rb_inspecting_p): use get_inspect_tbl(). * eval.c (rb_f_abort): call exit(1) if exception is raised. This patch was made by Nobuyoshi Nakada on 2002-05-30. (ruby-bugs-ja PR#236) * signal.c: disable Ruby's interrupt handler at the beginning. (ruby-bugs-ja PR#236) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3817 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index adb511311e..3331daa70f 100644 --- a/array.c +++ b/array.c @@ -929,14 +929,36 @@ inspect_call(arg) return (*arg->func)(arg->arg1, arg->arg2); } +static VALUE +get_inspect_tbl(create) + int create; +{ + VALUE inspect_tbl = rb_thread_local_aref(rb_thread_current(), inspect_key); + + if (create && NIL_P(inspect_tbl)) { + tbl_init: + inspect_tbl = rb_ary_new(); + rb_thread_local_aset(rb_thread_current(), inspect_key, inspect_tbl); + } + else if (TYPE(inspect_tbl) != T_ARRAY) { + rb_warn("invalid inspect_tbl value"); + if (create) goto tbl_init; + rb_thread_local_aset(rb_thread_current(), inspect_key, Qnil); + return Qnil; + } + return inspect_tbl; +} + static VALUE inspect_ensure(obj) VALUE obj; { VALUE inspect_tbl; - inspect_tbl = rb_thread_local_aref(rb_thread_current(), inspect_key); - rb_ary_pop(inspect_tbl); + inspect_tbl = get_inspect_tbl(Qfalse); + if (!NIL_P(inspect_tbl)) { + rb_ary_pop(inspect_tbl); + } return 0; } @@ -949,11 +971,7 @@ rb_protect_inspect(func, obj, arg) VALUE inspect_tbl; VALUE id; - inspect_tbl = rb_thread_local_aref(rb_thread_current(), inspect_key); - if (NIL_P(inspect_tbl)) { - inspect_tbl = rb_ary_new(); - rb_thread_local_aset(rb_thread_current(), inspect_key, inspect_tbl); - } + inspect_tbl = get_inspect_tbl(Qtrue); id = rb_obj_id(obj); if (rb_ary_includes(inspect_tbl, id)) { return (*func)(obj, arg); @@ -972,7 +990,7 @@ rb_inspecting_p(obj) { VALUE inspect_tbl; - inspect_tbl = rb_thread_local_aref(rb_thread_current(), inspect_key); + inspect_tbl = get_inspect_tbl(Qfalse); if (NIL_P(inspect_tbl)) return Qfalse; return rb_ary_includes(inspect_tbl, rb_obj_id(obj)); } -- cgit v1.2.3