mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #6237 from dearblue/env-strict
Stricter env objects to attach to ci
This commit is contained in:
@@ -16,6 +16,13 @@
|
||||
*/
|
||||
MRB_BEGIN_DECL
|
||||
|
||||
/*
|
||||
* env object (for internal used)
|
||||
*
|
||||
* - don't create multiple envs on one ci.
|
||||
* - don't share a env to different ci.
|
||||
* - don't attach a closed env to any ci.
|
||||
*/
|
||||
struct REnv {
|
||||
MRB_OBJECT_HEADER;
|
||||
mrb_value *stack;
|
||||
|
||||
@@ -130,7 +130,7 @@ stack_init(mrb_state *mrb)
|
||||
}
|
||||
|
||||
static inline void
|
||||
envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize)
|
||||
envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase)
|
||||
{
|
||||
mrb_callinfo *ci = mrb->c->cibase;
|
||||
ptrdiff_t delta = newbase - oldbase;
|
||||
@@ -138,10 +138,11 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize
|
||||
if (delta == 0) return;
|
||||
while (ci <= mrb->c->ci) {
|
||||
struct REnv *e = mrb_vm_ci_env(ci);
|
||||
mrb_value *st;
|
||||
|
||||
if (e && MRB_ENV_ONSTACK_P(e) &&
|
||||
(st = e->stack) && (size_t)(st - oldbase) < oldsize) {
|
||||
if (e) {
|
||||
mrb_assert(e->cxt == mrb->c && MRB_ENV_ONSTACK_P(e));
|
||||
mrb_assert(e->stack == ci->stack);
|
||||
|
||||
e->stack += delta;
|
||||
}
|
||||
ci->stack += delta;
|
||||
@@ -178,7 +179,7 @@ stack_extend_alloc(mrb_state *mrb, mrb_int room)
|
||||
|
||||
newstack = (mrb_value*)mrb_realloc(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
|
||||
stack_clear(&(newstack[oldsize]), size - oldsize);
|
||||
envadjust(mrb, oldbase, newstack, oldsize);
|
||||
envadjust(mrb, oldbase, newstack);
|
||||
mrb->c->stbase = newstack;
|
||||
mrb->c->stend = mrb->c->stbase + size;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user