[前][次][番号順一覧][スレッド一覧]

ruby-changes:22558

From: naruse <ko1@a...>
Date: Wed, 15 Feb 2012 07:16:35 +0900 (JST)
Subject: [ruby-changes:22558] naruse:r34607 (ruby_1_9_3): merge revision(s) 34555: [Backport #5786]

naruse	2012-02-15 07:16:06 +0900 (Wed, 15 Feb 2012)

  New Revision: 34607

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34607

  Log:
    merge revision(s) 34555: [Backport #5786]
    
    * compile.c (defined_expr): guard the whole expression.
      [ruby-dev:45021][Bug#5786]

  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/compile.c
    branches/ruby_1_9_3/test/ruby/test_defined.rb
    branches/ruby_1_9_3/version.h

Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 34606)
+++ ruby_1_9_3/ChangeLog	(revision 34607)
@@ -1,3 +1,8 @@
+Wed Feb 15 07:15:50 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* compile.c (defined_expr): guard the whole expression.
+	  [ruby-dev:45021][Bug#5786]
+
 Wed Feb 15 05:08:25 2012  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/dl/cptr.c (rb_dlptr_s_to_ptr): use rb_check_funcall.
Index: ruby_1_9_3/compile.c
===================================================================
--- ruby_1_9_3/compile.c	(revision 34606)
+++ ruby_1_9_3/compile.c	(revision 34607)
@@ -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
@@ -2600,6 +2618,7 @@
     }
 }
 
+#define defined_expr defined_expr0
 static int
 defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
 	     NODE *node, LABEL **lfinish, VALUE needstr)
@@ -2721,21 +2740,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);
 	}
@@ -2799,7 +2806,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: ruby_1_9_3/version.h
===================================================================
--- ruby_1_9_3/version.h	(revision 34606)
+++ ruby_1_9_3/version.h	(revision 34607)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 115
+#define RUBY_PATCHLEVEL 116
 
 #define RUBY_RELEASE_DATE "2012-02-15"
 #define RUBY_RELEASE_YEAR 2012
Index: ruby_1_9_3/test/ruby/test_defined.rb
===================================================================
--- ruby_1_9_3/test/ruby/test_defined.rb	(revision 34606)
+++ ruby_1_9_3/test/ruby/test_defined.rb	(revision 34607)
@@ -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/

[前][次][番号順一覧][スレッド一覧]