summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/cdump.c2
-rw-r--r--src/parse.y5
-rw-r--r--src/vm.c20
3 files changed, 13 insertions, 14 deletions
diff --git a/src/cdump.c b/src/cdump.c
index 7029ae3de..f9525d042 100644
--- a/src/cdump.c
+++ b/src/cdump.c
@@ -146,7 +146,7 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f)
}
}
memset(buf, 0, buf_len);
- SOURCE_CODE(" irep->pool[%d] = mrb_str_new(mrb, \"%s\", %ld);", n, str_to_format(irep->pool[n], buf), RSTRING_LEN(irep->pool[n])); break;
+ SOURCE_CODE(" irep->pool[%d] = mrb_str_new(mrb, \"%s\", %d);", n, str_to_format(irep->pool[n], buf), RSTRING_LEN(irep->pool[n])); break;
/* TODO MRB_TT_REGEX */
default: break;
}
diff --git a/src/parse.y b/src/parse.y
index 5bce579e7..4c339f0f4 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -3056,12 +3056,11 @@ peek_n(parser_state *p, int c, int n)
node *list = 0;
int c0;
- n++; /* must read 1 char */
- while (n--) {
+ do {
c0 = nextc(p);
if (c0 < 0) return FALSE;
list = push(list, (node*)(intptr_t)c0);
- }
+ } while(n--);
if (p->pb) {
p->pb = push(p->pb, (node*)list);
}
diff --git a/src/vm.c b/src/vm.c
index 876f72965..cfb404ee3 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -126,6 +126,16 @@ cipush(mrb_state *mrb)
static void
cipop(mrb_state *mrb)
{
+ if (mrb->ci->env) {
+ struct REnv *e = mrb->ci->env;
+ int len = (int)e->flags;
+ mrb_value *p = mrb_malloc(mrb, sizeof(mrb_value)*len);
+
+ e->cioff = -1;
+ memcpy(p, e->stack, sizeof(mrb_value)*len);
+ e->stack = p;
+ }
+
mrb->ci--;
}
@@ -965,16 +975,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_RETURN) {
/* A return R(A) */
L_RETURN:
- if (mrb->ci->env) {
- struct REnv *e = mrb->ci->env;
- int len = (int)e->flags;
- mrb_value *p = mrb_malloc(mrb, sizeof(mrb_value)*len);
-
- e->cioff = -1;
- memcpy(p, e->stack, sizeof(mrb_value)*len);
- e->stack = p;
- }
-
if (mrb->exc) {
mrb_callinfo *ci;