summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-09-05 02:01:02 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-09-05 02:01:02 +0900
commit2550edd570f1d7485e862ce11ceb50ea59dee3c5 (patch)
tree7ad9e3459c82cc25e93499a6c247b083262b7d05 /include
parent8bb7962eb8e193e94d866626f07d52b63ff2016c (diff)
downloadmruby-2550edd570f1d7485e862ce11ceb50ea59dee3c5.tar.gz
mruby-2550edd570f1d7485e862ce11ceb50ea59dee3c5.zip
remove `origin` member to implement prepend from struct RClass; ref #2885
instead origin is saved in ICLASS with MRB_FLAG_IS_ORIGIN set.
Diffstat (limited to 'include')
-rw-r--r--include/mruby/class.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/include/mruby/class.h b/include/mruby/class.h
index 80a0cbe35..85f3e12c6 100644
--- a/include/mruby/class.h
+++ b/include/mruby/class.h
@@ -16,7 +16,6 @@ struct RClass {
struct iv_tbl *iv;
struct kh_mt *mt;
struct RClass *super;
- struct RClass *origin;
};
#define mrb_class_ptr(v) ((struct RClass*)(mrb_ptr(v)))
@@ -50,7 +49,16 @@ mrb_class(mrb_state *mrb, mrb_value v)
}
// TODO: figure out where to put user flags
+#define MRB_FLAG_IS_PREPENDED (1 << 19)
#define MRB_FLAG_IS_ORIGIN (1 << 20)
+#define MRB_CLASS_ORIGIN(c) do {\
+ if (c->flags & MRB_FLAG_IS_PREPENDED) {\
+ c = c->super;\
+ while (!(c->flags & MRB_FLAG_IS_ORIGIN)) {\
+ c = c->super;\
+ }\
+ }\
+} while (0)
#define MRB_INSTANCE_TT_MASK (0xFF)
#define MRB_SET_INSTANCE_TT(c, tt) c->flags = ((c->flags & ~MRB_INSTANCE_TT_MASK) | (char)tt)
#define MRB_INSTANCE_TT(c) (enum mrb_vtype)(c->flags & MRB_INSTANCE_TT_MASK)