summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/class.c10
-rw-r--r--src/mruby_core.rake17
-rw-r--r--src/vm.c9
3 files changed, 14 insertions, 22 deletions
diff --git a/src/class.c b/src/class.c
index 26366aeb9..e28951499 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1375,8 +1375,10 @@ include_module_at(mrb_state *mrb, struct RClass *c, struct RClass *ins_pos, stru
void *klass_mt = find_origin(c)->mt;
while (m) {
- int superclass_seen = 0;
+ int original_seen = FALSE;
+ int superclass_seen = FALSE;
+ if (c == ins_pos) original_seen = TRUE;
if (m->flags & MRB_FL_CLASS_IS_PREPENDED)
goto skip;
@@ -1385,16 +1387,17 @@ include_module_at(mrb_state *mrb, struct RClass *c, struct RClass *ins_pos, stru
p = c->super;
while (p) {
+ if (c == p) original_seen = TRUE;
if (p->tt == MRB_TT_ICLASS) {
if (p->mt == m->mt) {
- if (!superclass_seen) {
+ if (!superclass_seen && original_seen) {
ins_pos = p; /* move insert point */
}
goto skip;
}
} else if (p->tt == MRB_TT_CLASS) {
if (!search_super) break;
- superclass_seen = 1;
+ superclass_seen = TRUE;
}
p = p->super;
}
@@ -1569,7 +1572,6 @@ mrb_singleton_class_ptr(mrb_state *mrb, mrb_value v)
case MRB_TT_TRUE:
return mrb->true_class;
case MRB_TT_CPTR:
- return mrb->object_class;
case MRB_TT_SYMBOL:
case MRB_TT_INTEGER:
#ifndef MRB_NO_FLOAT
diff --git a/src/mruby_core.rake b/src/mruby_core.rake
deleted file mode 100644
index c4816d4ce..000000000
--- a/src/mruby_core.rake
+++ /dev/null
@@ -1,17 +0,0 @@
-as_cxx_srcs = %w[vm error gc].map{|name| "#{MRUBY_ROOT}/src/#{name}.c"}
-
-MRuby.each_target do
- objs = Dir.glob("#{MRUBY_ROOT}/src/*.c").map do |src|
- dst = src.pathmap("#{build_dir}/src/%n")
- if cxx_exception_enabled? && as_cxx_srcs.include?(src)
- compile_as_cxx(src, "#{dst}.cxx")
- else
- objfile(dst)
- end
- end
- self.libmruby_objs << objs
-
- file libmruby_core_static => objs do |t|
- archiver.run t.name, t.prerequisites
- end
-end
diff --git a/src/vm.c b/src/vm.c
index c87fa9dc6..721a6c9b7 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1590,7 +1590,10 @@ RETRY_TRY_BLOCK:
mrb_exc_set(mrb, exc);
goto L_RAISE;
}
- if (target_class->tt == MRB_TT_MODULE) {
+ if (target_class->flags & MRB_FL_CLASS_IS_PREPENDED) {
+ target_class = ci->target_class;
+ }
+ else if (target_class->tt == MRB_TT_MODULE) {
target_class = ci->target_class;
if (target_class->tt != MRB_TT_ICLASS) {
mrb_value exc = mrb_exc_new_lit(mrb, E_RUNTIME_ERROR, "superclass info lost [mruby limitations]");
@@ -2817,6 +2820,10 @@ RETRY_TRY_BLOCK:
goto L_RAISE;
}
+ CASE(OP_SENDVK, BB) { /* not yet implemented */
+ NEXT;
+ }
+
CASE(OP_STOP, Z) {
/* stop VM */
CHECKPOINT_RESTORE(RBREAK_TAG_STOP) {