summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-05-18 23:02:35 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-05-18 23:02:35 +0900
commita1d11762dc494a1d72064703f3c817f6031d77cb (patch)
tree9b3192de9964609e5a0a536cd0485e72fc79bfca /src
parent4a6650b191d9715f7ebfe32038b351c84d2675f3 (diff)
parentef4f29be70b041dd4bc656b2db504ddb972ac56f (diff)
downloadmruby-a1d11762dc494a1d72064703f3c817f6031d77cb.tar.gz
mruby-a1d11762dc494a1d72064703f3c817f6031d77cb.zip
Merge pull request #2288 from ksss/define-class
support class define in singleton class
Diffstat (limited to 'src')
-rw-r--r--src/class.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/class.c b/src/class.c
index c256d8f9b..dd7bc4fea 100644
--- a/src/class.c
+++ b/src/class.c
@@ -227,6 +227,7 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id
}
switch (mrb_type(outer)) {
case MRB_TT_CLASS:
+ case MRB_TT_SCLASS:
case MRB_TT_MODULE:
break;
default:
@@ -1245,21 +1246,31 @@ mrb_class_path(mrb_state *mrb, struct RClass *c)
{
mrb_value path;
const char *name;
- mrb_int len;
mrb_sym classpath = mrb_intern_lit(mrb, "__classpath__");
path = mrb_obj_iv_get(mrb, (struct RObject*)c, classpath);
if (mrb_nil_p(path)) {
struct RClass *outer = mrb_class_outer_module(mrb, c);
mrb_sym sym = mrb_class_sym(mrb, c, outer);
+ mrb_int len;
+
if (sym == 0) {
return mrb_nil_value();
}
else if (outer && outer != mrb->object_class) {
mrb_value base = mrb_class_path(mrb, outer);
- path = mrb_str_plus(mrb, base, mrb_str_new_lit(mrb, "::"));
+ path = mrb_str_buf_new(mrb, 0);
+ if (mrb_nil_p(base)) {
+ mrb_str_cat_lit(mrb, path, "#<Class:");
+ mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, outer));
+ mrb_str_cat_lit(mrb, path, ">");
+ }
+ else {
+ mrb_str_concat(mrb, path, base);
+ }
+ mrb_str_cat_lit(mrb, path, "::");
name = mrb_sym2name_len(mrb, sym, &len);
- mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len));
+ mrb_str_cat(mrb, path, name, len);
}
else {
name = mrb_sym2name_len(mrb, sym, &len);