summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
AgeCommit message (Collapse)Author
2016-12-10do not destroy a page with an active TT_ENV (e.g. an env referred from TT_FIBER)Kazuho Oku
2016-12-08fix issues of mrb_gc_unregister introduced in 09b1185Kazuho Oku
* fixes partial copy of objects in GC root array (due to missing `* sizeof(mrb_value)`) * restores the behavior that permitted an unregistered object to be used as an argument
2016-12-07Mark all the built-in classes during GC sweepBouke van der Bijl
Reported by https://hackerone.com/haquaman
2016-12-06Add type check for cls before allocationYukihiro "Matz" Matsumoto
2016-11-30check ttype before object allocation; fix #3294Yukihiro "Matz" Matsumoto
2016-11-28pre-allocate arena overflow errorYukihiro "Matz" Matsumoto
2016-10-28should not unshare() reclaimed env objects; fix #3230Yukihiro "Matz" Matsumoto
2016-09-28Removed trailing spacesNobuyoshi Nakada
2016-06-29Fix compilation error with GC_PROFILE.Yuji Yamano
2016-06-10mrb_gc_unregister() to remove one registration; close #3160Yukihiro "Matz" Matsumoto
when multiple mrb_gc_register() were called for the same object
2016-03-06Fix segmentation fault by backtrace and GCKouhei Sutou
GitHub: fix #3122 It reverts #3126. #3126 fixes the segmentation fault but generates broken backtrace. This change fixes the segmentation fault and generates correct backtrace. The strategy of this change is "generating backtrace while irep is alive". /tmp/test.rb: def gen e0 = nil begin 1.times { raise 'foobar' } rescue => e e0 = e end e0 end e = gen GC.start gen GC.start puts e.backtrace.join("\n") Run: % bin/mruby /tmp/test.rb /tmp/test.rb:5:in Object.gen /home/kou/work/ruby/mruby.kou/mrblib/numeric.rb:77:in Integral#times /tmp/test.rb:4:in Object.gen /tmp/test.rb:13 FYI: % ruby -v /tmp/test.rb ruby 2.3.0p0 (2015-12-25) [x86_64-linux-gnu] /tmp/test.rb:5:in `block in gen' /tmp/test.rb:4:in `times' /tmp/test.rb:4:in `gen' /tmp/test.rb:13:in `<main>'
2016-02-17need to free context when reclaiming fiber object in GC; fix #3109Yukihiro "Matz" Matsumoto
2016-01-19Fix SEGV on re-raising NoMemoryErrorKouhei Sutou
Think about the following Ruby script: segv.rb: begin lambda do lambda do "x" * 1000 # NoMemoryError end.call end.call rescue raise end If memory can't allocate after `"x" * 1000`, mruby crashes. Because L_RAISE: block in mrb_vm_exec() calls mrb_env_unshare() via cipop() and mrb_env_unshare() uses allocated memory without NULL check: L_RAISE: block: L_RAISE: // ... while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); // ... } cipop(): static void cipop(mrb_state *mrb) { struct mrb_context *c = mrb->c; if (c->ci->env) { mrb_env_unshare(mrb, c->ci->env); } c->ci--; } mrb_env_unshare(): MRB_API void mrb_env_unshare(mrb_state *mrb, struct REnv *e) { size_t len = (size_t)MRB_ENV_STACK_LEN(e); // p is NULL in this case mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len); MRB_ENV_UNSHARE_STACK(e); if (len > 0) { stack_copy(p, e->stack, len); // p is NULL but used. It causes SEGV. } e->stack = p; mrb_write_barrier(mrb, (struct RBasic *)e); } To solve the SEGV, this change always raises NoMemoryError even when realloc() is failed after the first NoMemoryError in mrb_realloc(). mrb_unv_unshare() doesn't need to check NULL with this change. But it causes infinite loop in the following while: L_RAISE: // ... while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); // ... } Because cipop() never pops ci. This change includes cipop() change. The change pops ci even when mrb_unv_unshare() is failed by NoMemoryError. This case can be reproduced by the following program: #include <stdlib.h> #include <mruby.h> #include <mruby/compile.h> static void * allocf(mrb_state *mrb, void *ptr, size_t size, void *ud) { static mrb_bool always_fail = FALSE; if (size == 1001) { always_fail = TRUE; } if (always_fail) { return NULL; } if (size == 0) { free(ptr); return NULL; } else { return realloc(ptr, size); } } int main(int argc, char **argv) { mrb_state *mrb; mrbc_context *c; FILE *file; mrb = mrb_open_allocf(allocf, NULL); c = mrbc_context_new(mrb); file = fopen(argv[1], "r"); mrb_load_file_cxt(mrb, file, c); fclose(file); mrbc_context_free(mrb, c); mrb_close(mrb); return EXIT_SUCCESS; } Try the following command lines: % cc -I include -L build/host/lib -O0 -g3 -o no-memory no-memory.c -lmruby -lm % ./no-memory segv.rb
2015-12-31GC must scan env from fibers even when it's not yet copied to heap; fix #3063Yukihiro "Matz" Matsumoto
2015-11-27include changed from by quotes ("") to by brackets (<>); close #3032Yukihiro "Matz" Matsumoto
2015-11-06remove returncremno
The return type of the mrb_objspace_each_objects function is void. So this return statement with an expression is unnecessary and also violates a constraint. From C99 §6.8.6.4: >A return statement with an expression shall not appear >in a function whose return type is void.
2015-10-21Merge upstreamfurunkel
2015-10-20Prefix mrb_gc_state enum members, make color defines privatefurunkel
2015-10-19Remove gc_ prefix of mrb_gc fieldsfurunkel
2015-10-19Move MRB_GC_ARENA_SIZE to gc.h and fix compiler warningsfurunkel
2015-10-19Remove segregated value struct declarationfurunkel
2015-10-19Clean up GC codefurunkel
2015-09-22add new functions mrb_gc_register/unregister; close #1411Yukihiro "Matz" Matsumoto
some routines need to refer mruby objects (e.g. callbacks), in that case you have to protect your objects from garbage collection. the new functions mrb_gc_register() keeps those objects from GC. you have to remove your objects using mrb_gc_unregister() when your C routines use mruby objects any longer, otherwise objects will leak.
2015-07-14Applied gc patch to fix ORIGIN ICLASS method table leakCorey Powell
Based on the gc patch by ko1 https://github.com/ruby/ruby/commit/5922c954614e5947a548780bb3b894626affe6dd
2014-10-02cast MRB_ENV_STACK_LEN to (mrb_int); ref #2600Yukihiro "Matz" Matsumoto
2014-08-29Fix mismatches for MRB_API declarations.Tatsuhiko Kubo
2014-08-27Merge pull request #2567 from cubicdaiya/issues/space_after_comma2Yukihiro "Matz" Matsumoto
Add a missing space after ",".
2014-08-27Add a missing space after ",".Tatsuhiko Kubo
2014-08-27Use mrb_malloc() instead of mrb_realloc().Tatsuhiko Kubo
2014-08-27Remove discareded NULL checks.Tatsuhiko Kubo
2014-08-07Fix typo in gc.cJun Hiroe
2014-08-07Merge pull request #2512 from suzukaze/gc-state-rootYukihiro "Matz" Matsumoto
Rename GC_STATE_NONE GC_STATE_ROOT
2014-08-06Refactor incremental_sweep_phase() in gc.cJun Hiroe
2014-08-06Rename GC_STATE_NONE GC_STATE_ROOTJun Hiroe
2014-08-05Refactor obj_free() in gc.cJun Hiroe
2014-08-05write barrier doc updateYukihiro "Matz" Matsumoto
2014-08-05Merge branch 'add-gc-docs' of https://github.com/suzukaze/mruby into ↵Yukihiro "Matz" Matsumoto
suzukaze-add-gc-docs
2014-08-05Add write_barrier docsJun Hiroe
2014-08-04Merge branch 'master' of github.com:mruby/mrubyYukihiro "Matz" Matsumoto
2014-08-03fix conversion warningscremno
Those warnings are not enabled by default, but getting rid of them doesn't hurt.
2014-08-04rename obsolete mrb_special_const_p to mrb_immediate_pYukihiro "Matz" Matsumoto
2014-08-04add MRB_API modifiers to mruby API functionsYukihiro "Matz" Matsumoto
2014-07-28Use RString in `mesg` instead.take_cheeze
2014-07-28Store exception message to `mesg` field of `struct RException`.take_cheeze
2014-07-24Merge pull request #2477 from take-cheeze/allocf_udYukihiro "Matz" Matsumoto
Add field `allocf_ud` to replace current `ud`.
2014-07-21Use MRB_TT_EXCEPTION in exception object.take_cheeze
2014-07-17Add field `allocf_ud` to replace current `ud`.take_cheeze
Since some use it as `mrb_state` associated user data.
2014-07-02Ensure RVALUE is large enough for word boxing types.David Turnbull
2014-06-04mark pre-allocated exceptionYukihiro "Matz" Matsumoto
2014-06-04use pre-allocated RuntimeError for out-of-memoryYukihiro "Matz" Matsumoto