summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-02-14 22:16:06 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-02-14 22:16:06 +0000
commit00af7b8f9ad70d1d893a0e98782450e44a72951b (patch)
tree1229d406433449fe2c1130e28cc709f7f5aeabf2
parent35c546104b00e1e773bcdfd59bb0cd580c85b190 (diff)
merge revision(s) 34555: [Backport #5786]
* compile.c (defined_expr): guard the whole expression. [ruby-dev:45021][Bug#5786] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34607 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--compile.c54
-rw-r--r--test/ruby/test_defined.rb12
-rw-r--r--version.h2
4 files changed, 60 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 4041ae169f..eea20bc4bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Feb 15 07:15:50 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (defined_expr): guard the whole expression.
+ [ruby-dev:45021][Bug#5786]
+
Wed Feb 15 05:08:25 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/dl/cptr.c (rb_dlptr_s_to_ptr): use rb_check_funcall.
diff --git a/compile.c b/compile.c
index 53149cafb2..61e0f32e01 100644
--- a/compile.c
+++ b/compile.c
@@ -238,6 +238,9 @@ r_value(VALUE value)
#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 @@ ADD_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor, LINK_ELEMENT *elem)
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 @@ compile_cpath(LINK_ANCHOR *ret, rb_iseq_t *iseq, NODE *cpath)
}
}
+#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 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
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,6 +2806,29 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
}
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
diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb
index bae85c9265..2552626b9e 100644
--- a/test/ruby/test_defined.rb
+++ b/test/ruby/test_defined.rb
@@ -113,15 +113,27 @@ class TestDefined < Test::Unit::TestCase
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
diff --git a/version.h b/version.h
index cc8857647b..e4ba1a5d3d 100644
--- a/version.h
+++ b/version.h
@@ -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