diff options
| -rw-r--r-- | Rakefile | 4 | ||||
| -rw-r--r-- | include/mruby.h | 2 | ||||
| -rw-r--r-- | include/mruby/ops.h | 7 | ||||
| -rw-r--r-- | src/class.c | 10 | ||||
| -rw-r--r-- | src/vm.c | 9 | ||||
| -rw-r--r-- | tasks/core.rake (renamed from src/mruby_core.rake) | 0 | ||||
| -rw-r--r-- | tasks/mrblib.rake (renamed from mrblib/mrblib.rake) | 0 |
7 files changed, 21 insertions, 11 deletions
@@ -22,8 +22,8 @@ MRuby.each_target do |build| end # load custom rules -load "#{MRUBY_ROOT}/src/mruby_core.rake" -load "#{MRUBY_ROOT}/mrblib/mrblib.rake" +load "#{MRUBY_ROOT}/tasks/core.rake" +load "#{MRUBY_ROOT}/tasks/mrblib.rake" load "#{MRUBY_ROOT}/tasks/mrbgems.rake" load "#{MRUBY_ROOT}/tasks/libmruby.rake" diff --git a/include/mruby.h b/include/mruby.h index 0fad0d440..8099a85e2 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -287,7 +287,7 @@ typedef struct mrb_state { struct RObject *nomem_err; /* pre-allocated NoMemoryError */ struct RObject *stack_err; /* pre-allocated SysStackError */ #ifdef MRB_GC_FIXED_ARENA - struct RObject *arena_err; /* pre-allocated arena overfow error */ + struct RObject *arena_err; /* pre-allocated arena overflow error */ #endif void *ud; /* auxiliary data */ diff --git a/include/mruby/ops.h b/include/mruby/ops.h index 87f48d2a9..02f227634 100644 --- a/include/mruby/ops.h +++ b/include/mruby/ops.h @@ -61,13 +61,14 @@ OPCODE(SENDV, BB) /* R(a) = call(R(a),Syms(b),*R(a+1)) */ OPCODE(SENDVB, BB) /* R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2)) */ OPCODE(SEND, BBB) /* R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c)) */ OPCODE(SENDB, BBB) /* R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c),&R(a+c+1)) */ +OPCODE(SENDVK, BB) /* R(a) = call(R(a),Syms(b),*R(a+1),**(a+2),&R(a+3)) # todo */ OPCODE(CALL, Z) /* R(0) = self.call(frame.argc, frame.argv) */ OPCODE(SUPER, BB) /* R(a) = super(R(a+1),... ,R(a+b+1)) */ OPCODE(ARGARY, BS) /* R(a) = argument array (16=m5:r1:m5:d1:lv4) */ OPCODE(ENTER, W) /* arg setup according to flags (23=m5:o5:r1:m5:k5:d1:b1) */ -OPCODE(KEY_P, BB) /* R(a) = kdict.key?(Syms(b)) # todo */ -OPCODE(KEYEND, Z) /* raise unless kdict.empty? # todo */ -OPCODE(KARG, BB) /* R(a) = kdict[Syms(b)]; kdict.delete(Syms(b)) # todo */ +OPCODE(KEY_P, BB) /* R(a) = kdict.key?(Syms(b)) */ +OPCODE(KEYEND, Z) /* raise unless kdict.empty? */ +OPCODE(KARG, BB) /* R(a) = kdict[Syms(b)]; kdict.delete(Syms(b)) */ OPCODE(RETURN, B) /* return R(a) (normal) */ OPCODE(RETURN_BLK, B) /* return R(a) (in-block return) */ OPCODE(BREAK, B) /* break R(a) */ 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 @@ -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) { diff --git a/src/mruby_core.rake b/tasks/core.rake index c4816d4ce..c4816d4ce 100644 --- a/src/mruby_core.rake +++ b/tasks/core.rake diff --git a/mrblib/mrblib.rake b/tasks/mrblib.rake index 7231b63bc..7231b63bc 100644 --- a/mrblib/mrblib.rake +++ b/tasks/mrblib.rake |
