diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.c | 12 | ||||
| -rw-r--r-- | src/hash.c | 10 |
2 files changed, 16 insertions, 6 deletions
diff --git a/src/codegen.c b/src/codegen.c index 1f087b2cd..2d01ed701 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -170,6 +170,10 @@ genop_peep(codegen_scope *s, mrb_code i, int val) switch (c1) { case OP_MOVE: + if (GETARG_A(i) == GETARG_B(i)) { + /* skip useless OP_MOVE */ + return; + } if (val) break; switch (c0) { case OP_MOVE: @@ -849,8 +853,11 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) case NODE_CALL: push(); - gen_call(s, node, attrsym(s, sym(node->cdr->car)), sp, val); - val = NOVAL; /* push should have done in gen_call() */ + gen_call(s, node, attrsym(s, sym(node->cdr->car)), sp, NOVAL); + pop(); + if (val) { + genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val); + } break; default: @@ -1403,6 +1410,7 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, tree->cdr->cdr->car, VAL); pop(); gen_assignment(s, tree->car, cursp(), val); + if (val) pop(); dispatch(s, pos); break; } diff --git a/src/hash.c b/src/hash.c index 92dfff186..51f85f4e8 100644 --- a/src/hash.c +++ b/src/hash.c @@ -970,9 +970,10 @@ mrb_hash_keys(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h)); + mrb_value ary; - if (!h) return ary; + if (!h) return mrb_ary_new(mrb); + ary = mrb_ary_new_capa(mrb, kh_size(h)); for (k = kh_begin(h); k != kh_end(h); k++) { if (kh_exist(h, k)) { mrb_value v = kh_key(h,k); @@ -1000,9 +1001,10 @@ mrb_hash_values(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h)); + mrb_value ary; - if (!h) return ary; + if (!h) return mrb_ary_new(mrb); + ary = mrb_ary_new_capa(mrb, kh_size(h)); for (k = kh_begin(h); k != kh_end(h); k++) { if (kh_exist(h, k)){ mrb_value v = kh_value(h,k); |
