summaryrefslogtreecommitdiff
path: root/class.c
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 /class.c
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
Diffstat (limited to 'class.c')
-rw-r--r--class.c19
1 files changed, 13 insertions, 6 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) {