summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c12
-rw-r--r--src/hash.c10
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);