summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2012-05-12 02:57:29 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2012-05-12 02:57:29 -0700
commit04f8ec7570e79a64c586414edbf8b607da1f1670 (patch)
tree700d8ee8bfd1019ba8b63816688acdf4fd4ef072 /src
parente7b4ea94e824a9ffdb2df542eb3864b0b18287c8 (diff)
parent632556bc6f9038a48891a848b4632e69ee0c4053 (diff)
downloadmruby-04f8ec7570e79a64c586414edbf8b607da1f1670.tar.gz
mruby-04f8ec7570e79a64c586414edbf8b607da1f1670.zip
Merge pull request #118 from k-tsj/move-stack-values
Move stack values to heap whenever ci is popped
Diffstat (limited to 'src')
-rw-r--r--src/vm.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/vm.c b/src/vm.c
index 88b64ac79..43705a48f 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;