diff options
| author | Corey Powell <[email protected]> | 2015-07-14 09:44:04 -0500 |
|---|---|---|
| committer | Corey Powell <[email protected]> | 2015-07-14 09:44:04 -0500 |
| commit | eb172c28d79b4fdf978e78fc7e929caa855dd29b (patch) | |
| tree | 8303b34616c782fda76cef4c66a87b1cbd33b65c /src/gc.c | |
| parent | f0e920baf07e17fd1073566d7e9605f9192d766d (diff) | |
| download | mruby-eb172c28d79b4fdf978e78fc7e929caa855dd29b.tar.gz mruby-eb172c28d79b4fdf978e78fc7e929caa855dd29b.zip | |
Applied gc patch to fix ORIGIN ICLASS method table leak
Based on the gc patch by ko1
https://github.com/ruby/ruby/commit/5922c954614e5947a548780bb3b894626affe6dd
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -498,7 +498,12 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) mrb_gc_mark(mrb, (struct RBasic*)obj->c); switch (obj->tt) { case MRB_TT_ICLASS: - mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super); + { + struct RClass *c = (struct RClass*)obj; + if (MRB_FLAG_TEST(c, MRB_FLAG_IS_ORIGIN)) + mrb_gc_mark_mt(mrb, c); + mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super); + } break; case MRB_TT_CLASS: @@ -624,7 +629,10 @@ obj_free(mrb_state *mrb, struct RBasic *obj) mrb_gc_free_mt(mrb, (struct RClass*)obj); mrb_gc_free_iv(mrb, (struct RObject*)obj); break; - + case MRB_TT_ICLASS: + if (MRB_FLAG_TEST(obj, MRB_FLAG_IS_ORIGIN)) + mrb_gc_free_mt(mrb, (struct RClass*)obj); + break; case MRB_TT_ENV: { struct REnv *e = (struct REnv*)obj; |
