summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-05-31 17:01:49 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-05-31 17:01:49 +0900
commitb720cb635ab8c13832ac57cf11d07a3d848b8bd1 (patch)
treed0329fc4951b9b4fb039bae79ecaefd90de98154 /src
parentd9f191cf97f8c53e177f42d0223e80335c4b6e29 (diff)
parent59ea323976557408ba1c5f694213c7a31bbb6e39 (diff)
downloadmruby-b720cb635ab8c13832ac57cf11d07a3d848b8bd1.tar.gz
mruby-b720cb635ab8c13832ac57cf11d07a3d848b8bd1.zip
Merge pull request #2811 from cremno/check-if-outer-is-a-class-or-module
check if outer is a class or module
Diffstat (limited to 'src')
-rw-r--r--src/class.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/class.c b/src/class.c
index 3246564ec..35c3aa040 100644
--- a/src/class.c
+++ b/src/class.c
@@ -131,6 +131,19 @@ mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
return mrb_class_ptr(outer);
}
+static void
+check_if_class_or_module(mrb_state *mrb, mrb_value obj)
+{
+ switch (mrb_type(obj)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_SCLASS:
+ case MRB_TT_MODULE:
+ return;
+ default:
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_inspect(mrb, obj));
+ }
+}
+
static struct RClass*
define_module(mrb_state *mrb, mrb_sym name, struct RClass *outer)
{
@@ -160,6 +173,7 @@ mrb_define_module(mrb_state *mrb, const char *name)
MRB_API struct RClass*
mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
{
+ check_if_class_or_module(mrb, outer);
return define_module(mrb, id, mrb_class_ptr(outer));
}
@@ -232,15 +246,7 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id
else {
s = 0;
}
- switch (mrb_type(outer)) {
- case MRB_TT_CLASS:
- case MRB_TT_SCLASS:
- case MRB_TT_MODULE:
- break;
- default:
- mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", outer);
- break;
- }
+ check_if_class_or_module(mrb, outer);
c = define_class(mrb, id, s, mrb_class_ptr(outer));
mrb_class_inherited(mrb, mrb_class_real(c->super), c);