diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-10 16:02:47 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2016-12-10 16:02:47 +0900 |
| commit | 3cc913490b708fe4d0e78e48f86e6e39cf3d8576 (patch) | |
| tree | 90cac9474b018643579c88d8280950ec2d995524 | |
| parent | d93422315cceb4fbe0fcb17d070f329518343e49 (diff) | |
| parent | f7a891fa8979bdb82410e1adc98765013cc29a79 (diff) | |
| download | mruby-3cc913490b708fe4d0e78e48f86e6e39cf3d8576.tar.gz mruby-3cc913490b708fe4d0e78e48f86e6e39cf3d8576.zip | |
Merge pull request #3329 from bouk/reuse
Mark all the built-in classes during GC sweep
| -rw-r--r-- | mrbgems/mruby-bin-mruby/bintest/mruby.rb | 14 | ||||
| -rw-r--r-- | src/gc.c | 20 |
2 files changed, 34 insertions, 0 deletions
diff --git a/mrbgems/mruby-bin-mruby/bintest/mruby.rb b/mrbgems/mruby-bin-mruby/bintest/mruby.rb index 01fc94632..ad8ec3a0f 100644 --- a/mrbgems/mruby-bin-mruby/bintest/mruby.rb +++ b/mrbgems/mruby-bin-mruby/bintest/mruby.rb @@ -44,3 +44,17 @@ EOS script.flush assert_equal "\"test\"\n\"fin\"\n", `#{cmd('mruby')} #{script.path}` end + +assert('garbage collecting built-in classes') do + script = Tempfile.new('test.rb') + + script.write <<RUBY +NilClass = nil +GC.start +Array.dup +print nil.class.name +RUBY + script.flush + assert_equal "NilClass", `#{cmd('mruby')} #{script.path}` + assert_equal 0, $?.exitstatus +end @@ -833,6 +833,26 @@ root_scan_phase(mrb_state *mrb, mrb_gc *gc) } /* mark class hierarchy */ mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class); + + /* mark built-in classes */ + mrb_gc_mark(mrb, (struct RBasic*)mrb->class_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->module_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->proc_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->string_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->array_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->hash_class); + + mrb_gc_mark(mrb, (struct RBasic*)mrb->float_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->fixnum_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->true_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->false_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->nil_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->symbol_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->kernel_module); + + mrb_gc_mark(mrb, (struct RBasic*)mrb->eException_class); + mrb_gc_mark(mrb, (struct RBasic*)mrb->eStandardError_class); + /* mark top_self */ mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self); /* mark exception */ |
