diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 2 | ||||
| -rw-r--r-- | src/gc.c | 15 | ||||
| -rw-r--r-- | src/variable.c | 3 | ||||
| -rw-r--r-- | src/vm.c | 2 |
4 files changed, 13 insertions, 9 deletions
diff --git a/src/class.c b/src/class.c index bb6a97c65..a4f9f2873 100644 --- a/src/class.c +++ b/src/class.c @@ -1986,7 +1986,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.20 */ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */ mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */ - mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_NONE()); /* 15.2.2.4.24 */ + mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */ mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */ mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1)); mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_REQ(1)); @@ -448,26 +448,27 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c) static void mark_context(mrb_state *mrb, struct mrb_context *c) { - size_t i; - size_t e; + int i, e = 0; mrb_callinfo *ci; /* mark stack */ mark_context_stack(mrb, c); - /* mark ensure stack */ - e = (c->ci) ? c->ci->eidx : 0; - for (i=0; i<e; i++) { - mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); - } /* mark VM stack */ if (c->cibase) { for (ci = c->cibase; ci <= c->ci; ci++) { + if (ci->eidx > e) { + e = ci->eidx; + } mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } } + /* mark ensure stack */ + for (i=0; i<e; i++) { + mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); + } /* mark fibers */ if (c->prev && c->prev->fib) { mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib); diff --git a/src/variable.c b/src/variable.c index 90f0831da..231697d47 100644 --- a/src/variable.c +++ b/src/variable.c @@ -970,13 +970,16 @@ mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod) { mrb_value ary; + mrb_bool inherit = TRUE; struct RClass *c = mrb_class_ptr(mod); + mrb_get_args(mrb, "|b", &inherit); ary = mrb_ary_new(mrb); while (c) { if (c->iv) { iv_foreach(mrb, c->iv, const_i, &ary); } + if (!inherit) break; c = c->super; if (c == mrb->object_class) break; } @@ -143,7 +143,7 @@ stack_extend_alloc(mrb_state *mrb, int room) /* Use linear stack growth. It is slightly slower than doubling the stack space, but it saves memory on small devices. */ - if (room <= size) + if (room <= MRB_STACK_GROWTH) size += MRB_STACK_GROWTH; else size += room; |
