Commit e88e3052 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

should have adjusted stack address kept in closures; close #222

parent 27c2416d
...@@ -41,12 +41,30 @@ stack_init(mrb_state *mrb) ...@@ -41,12 +41,30 @@ stack_init(mrb_state *mrb)
mrb->ci->target_class = mrb->object_class; mrb->ci->target_class = mrb->object_class;
} }
static void
envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase)
{
mrb_callinfo *ci = mrb->cibase;
while (ci <= mrb->ci) {
struct REnv *e = ci->env;
if (e && e->cioff >= 0) {
int off = e->stack - oldbase;
e->stack = newbase + off;
}
ci++;
}
}
static void static void
stack_extend(mrb_state *mrb, int room, int keep) stack_extend(mrb_state *mrb, int room, int keep)
{ {
int size, off; int size, off;
if (mrb->stack + room >= mrb->stend) { if (mrb->stack + room >= mrb->stend) {
mrb_value *oldbase = mrb->stbase;
size = mrb->stend - mrb->stbase; size = mrb->stend - mrb->stbase;
off = mrb->stack - mrb->stbase; off = mrb->stack - mrb->stbase;
...@@ -57,6 +75,7 @@ stack_extend(mrb_state *mrb, int room, int keep) ...@@ -57,6 +75,7 @@ stack_extend(mrb_state *mrb, int room, int keep)
mrb->stbase = mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); mrb->stbase = mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size);
mrb->stack = mrb->stbase + off; mrb->stack = mrb->stbase + off;
mrb->stend = mrb->stbase + size; mrb->stend = mrb->stbase + size;
envadjust(mrb, oldbase, mrb->stbase);
} }
if (room > keep) { if (room > keep) {
memset(mrb->stack+keep, 0, sizeof(mrb_value) * (room-keep)); memset(mrb->stack+keep, 0, sizeof(mrb_value) * (room-keep));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment