summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-09 15:05:59 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-09 15:05:59 +0000
commitcb68586cdb8d3923174f72156b0e42ebba7d1195 (patch)
tree49c6a20394810c60bb04e68e2a81b6c4b296db1a
parent0deee2020f7e455a901ffca4d28655eb386df390 (diff)
merge revision(s) 58082,58083: [Backport #13236]
class.c: ensure_includable * class.c (ensure_includable): extract checks to include and prepend. class.c: prohibit refinement module * class.c (ensure_includable): cannot include refinement module, or the type and the class do not match. [ruby-core:79632] [Bug #13236] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@58632 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--class.c19
-rw-r--r--test/ruby/test_refinement.rb14
-rw-r--r--version.h2
3 files changed, 28 insertions, 7 deletions
diff --git a/class.c b/class.c
index 5c54b0c7d4..d73724bd60 100644
--- a/class.c
+++ b/class.c
@@ -849,14 +849,23 @@ rb_include_class_new(VALUE module, VALUE super)
static int include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super);
+static void
+ensure_includable(VALUE klass, VALUE module)
+{
+ rb_frozen_class_p(klass);
+ Check_Type(module, T_MODULE);
+ if (!NIL_P(rb_refinement_module_get_refined_class(module))) {
+ rb_raise(rb_eArgError, "refinement module is not allowed");
+ }
+ OBJ_INFECT(klass, module);
+}
+
void
rb_include_module(VALUE klass, VALUE module)
{
int changed = 0;
- rb_frozen_class_p(klass);
- Check_Type(module, T_MODULE);
- OBJ_INFECT(klass, module);
+ ensure_includable(klass, module);
changed = include_modules_at(klass, RCLASS_ORIGIN(klass), module, TRUE);
if (changed < 0)
@@ -966,9 +975,7 @@ rb_prepend_module(VALUE klass, VALUE module)
VALUE origin;
int changed = 0;
- rb_frozen_class_p(klass);
- Check_Type(module, T_MODULE);
- OBJ_INFECT(klass, module);
+ ensure_includable(klass, module);
origin = RCLASS_ORIGIN(klass);
if (origin == klass) {
diff --git a/test/ruby/test_refinement.rb b/test/ruby/test_refinement.rb
index f6e08729d7..82bdb49659 100644
--- a/test/ruby/test_refinement.rb
+++ b/test/ruby/test_refinement.rb
@@ -1886,6 +1886,20 @@ class TestRefinement < Test::Unit::TestCase
assert_equal("Parent -> Child", SuperToModule::Child.test, bug)
end
+ def test_include_refinement
+ bug = '[ruby-core:79632] [Bug #13236] cannot include refinement module'
+ r = nil
+ m = Module.new do
+ r = refine(String) {def test;:ok end}
+ end
+ assert_raise_with_message(ArgumentError, /refinement/, bug) do
+ m.module_eval {include r}
+ end
+ assert_raise_with_message(ArgumentError, /refinement/, bug) do
+ m.module_eval {prepend r}
+ end
+ end
+
private
def eval_using(mod, s)
diff --git a/version.h b/version.h
index 145e1302db..c31f1ba78d 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.4.2"
#define RUBY_RELEASE_DATE "2017-05-09"
-#define RUBY_PATCHLEVEL 126
+#define RUBY_PATCHLEVEL 127
#define RUBY_RELEASE_YEAR 2017
#define RUBY_RELEASE_MONTH 5