ruby-changes:22507
From: nobu <ko1@a...>
Date: Mon, 13 Feb 2012 08:30:32 +0900 (JST)
Subject: [ruby-changes:22507] nobu:r34555 (trunk): * compile.c (defined_expr): guard the whole expression.
nobu 2012-02-11 12:04:23 +0900 (Sat, 11 Feb 2012) New Revision: 34555 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34555 Log: * compile.c (defined_expr): guard the whole expression. [ruby-dev:45021][Bug#5786] Modified files: trunk/ChangeLog trunk/compile.c trunk/test/ruby/test_defined.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34554) +++ ChangeLog (revision 34555) @@ -1,3 +1,8 @@ +Sat Feb 11 12:04:05 2012 Nobuyoshi Nakada <nobu@r...> + + * compile.c (defined_expr): guard the whole expression. + [ruby-dev:45021][Bug#5786] + Sat Feb 11 08:34:42 2012 Eric Hodel <drbrain@s...> * ext/zlib/zlib.c (rb_inflate_add_dictionary): Added Index: compile.c =================================================================== --- compile.c (revision 34554) +++ compile.c (revision 34555) @@ -238,6 +238,9 @@ #define ADD_LABEL(seq, label) \ ADD_ELEM((seq), (LINK_ELEMENT *) (label)) +#define APPEND_LABEL(seq, before, label) \ + APPEND_ELEM((seq), (before), (LINK_ELEMENT *) (label)) + #define ADD_ADJUST(seq, line, label) \ ADD_ELEM((seq), (LINK_ELEMENT *) new_adjust_body(iseq, (label), (line))) @@ -392,8 +395,23 @@ anchor->last = elem; verify_list("add", anchor); } + +/* + * elem1, before, elem2 => elem1, before, elem, elem2 + */ +static void +APPEND_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor, LINK_ELEMENT *before, LINK_ELEMENT *elem) +{ + elem->prev = before; + elem->next = before->next; + elem->next->prev = elem; + before->next = elem; + if (before == anchor->last) anchor->last = elem; + verify_list("add", anchor); +} #if CPDEBUG < 0 #define ADD_ELEM(anchor, elem) ADD_ELEM(iseq, (anchor), (elem)) +#define APPEND_ELEM(anchor, before, elem) ADD_ELEM(iseq, (anchor), (before), (elem)) #endif static int @@ -2616,6 +2634,7 @@ } } +#define defined_expr defined_expr0 static int defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, LABEL **lfinish, VALUE needstr) @@ -2737,21 +2756,9 @@ ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]); } if (!self) { - LABEL *lstart = NEW_LABEL(nd_line(node)); - LABEL *lend = NEW_LABEL(nd_line(node)); - VALUE rescue = NEW_CHILD_ISEQVAL(NEW_NIL(), - rb_str_concat(rb_str_new2 - ("defined guard in "), - iseq->name), - ISEQ_TYPE_DEFINED_GUARD, 0); - defined_expr(iseq, ret, node->nd_recv, lfinish, Qfalse); ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]); - - ADD_LABEL(ret, lstart); COMPILE(ret, "defined/recv", node->nd_recv); - ADD_LABEL(ret, lend); - ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lfinish[1]); ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD), ID2SYM(node->nd_mid), needstr); } @@ -2815,7 +2822,30 @@ } return 0; } +#undef defined_expr +static int +defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret, + NODE *node, LABEL **lfinish, VALUE needstr) +{ + LINK_ELEMENT *lcur = ret->last; + int done = defined_expr0(iseq, ret, node, lfinish, needstr); + if (lfinish[1]) { + int line = nd_line(node); + LABEL *lstart = NEW_LABEL(line); + LABEL *lend = NEW_LABEL(line); + VALUE rescue = NEW_CHILD_ISEQVAL(NEW_NIL(), + rb_str_concat(rb_str_new2 + ("defined guard in "), + iseq->name), + ISEQ_TYPE_DEFINED_GUARD, 0); + APPEND_LABEL(ret, lcur, lstart); + ADD_LABEL(ret, lend); + ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lfinish[1]); + } + return done; +} + #define BUFSIZE 0x100 static VALUE Index: test/ruby/test_defined.rb =================================================================== --- test/ruby/test_defined.rb (revision 34554) +++ test/ruby/test_defined.rb (revision 34555) @@ -113,15 +113,27 @@ def a? defined?(A) end + def b? + defined?(A::B) + end end def test_autoloaded_noload loaded = $".dup $".clear + loadpath = $:.dup + $:.clear x = TestAutoloadedNoload.new assert_equal("constant", x.a?) + assert_nil(x.b?) assert_equal([], $") ensure $".replace(loaded) + $:.replace(loadpath) end + + def test_exception + bug5786 = '[ruby-dev:45021]' + assert_nil(defined?(raise("[Bug#5786]")::A), bug5786) + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/