summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
AgeCommit message (Collapse)Author
2019-12-25Fix potentially use of wrong method cacheKOBAYASHI Shuji
#### Example (with `MRB_METHOD_CACHE`) ```ruby GC.start c = Class.new p c #=> #<Class:0x7fd6a180e790> c.new #=> cache `c.new` c = nil GC.start #=> `c` is GCed r = Range.dup p r #=> #<Class:0x7fd6a180e790> # [same pointer as `c`] r.new(2, 3) #=> ArgumentError: 'initialize': # wrong number of arguments (2 for 0) # [`c.new` is called instead of `r.new`] ``` #### Cause An entry of method cache is identified by class pointer and method id. However, reusing memory after GC may create a class with the same pointer as the cached class. #### Treatment Cleared method caches of the class when the class is GCed.
2019-12-04Refine `mrb_alloca()`KOBAYASHI Shuji
* The allocated memory is guaranteed to be aligned for any data type (it was not guaranteed when string type is embed). * Make allocation size exactly specified size (does not allocate space for a null byte).
2019-11-23Add assertion to `RVALUE` sizeKOBAYASHI Shuji
2019-09-26Use type predicate macros instead of `mrb_type` if possibleKOBAYASHI Shuji
For efficiency with `MRB_WORD_BOXING` (implement type predicate macros for all `enum mrb_vtype`).
2019-08-20Use `RBasic` padding for embedded string on 64-bit CPUKOBAYASHI Shuji
On 64-bit CPU, there is padding in `RBasic`, so reorder the fields and use it as buffer of embedded string. This change allows 4 more bytes to be embedded on 64-bit CPU. However, an incompatibility will occur if `RString::as::ary` is accessed directly because `RString` structure has changed.
2019-08-16SHARED/FSHARED string is not required when sharing NOFREE stringKOBAYASHI Shuji
I think the string buffer of NOFREE string always exists and does not need to be released, so it can be shared as another NOFREE string. Also changed the `mrb_shared_string` field order so that eliminate padding if `int` and `mrb_int` sizes are less than pointer size.
2019-08-05Use new specifiers/modifiers of `mrb_vfromat()`KOBAYASHI Shuji
The binary sizes (gems are only `mruby-bin-mruby`) are reduced slightly in my environment than before the introduction of new specifiers/modifiers (5116789a) with this change. ------------+-------------------+-------------------+-------- BINARY | BEFORE (5116789a) | AFTER (This PR) | RATIO ------------+-------------------+-------------------+-------- mruby | 593416 bytes | 593208 bytes | -0.04% libmruby.a | 769048 bytes | 767264 bytes | -0.23% ------------+-------------------+-------------------+-------- BTW, I accidentally changed `tasks/toolchains/visualcpp.rake` at #4613, so I put it back.
2019-06-24Compare obj pointer directly instead of using mrb_obj_eq in mrb_gc_unregisterKOBAYASHI Shuji
Because immediate values are not registered.
2019-05-29Add `mrb_alloca` again; ref #4470Yukihiro "Matz" Matsumoto
This time, the allocated memory comes from the string object, which is referenced from GC arena. The memory region will be reclaimed when the C function called from VM is terminated, or the GC arena is restored.
2019-05-18Rename `struct RIstruct` to `struct RIStruct`.Yukihiro "Matz" Matsumoto
2019-05-04Check whether object is immediate in `mrb_gc_(register|unregister)`KOBAYASHI Shuji
2019-04-14Merge pull request #4376 from dearblue/leak-symbolsYukihiro "Matz" Matsumoto
Fix leaked function symbols
2019-04-14Fix leaked function symbolsdearblue
- `free_heap()` in src/gc.c - `symhash()` in src/symbol.c - `no_optimize()` in mrbgems/mruby-compiler/core/codegen.c
2019-04-14Include `RFiber` and `RIstruct` as a part of `RVALUE`dearblue
2019-01-01range: Embed edges in RRange on boxing environment.KOBAYASHI Shuji
[Breaking changes] Developers must use following APIs for accessing attributes of RRange because RRange structure depends on boxing setting. - mrb_range_beg - mrb_range_end - mrb_range_excl_p
2018-11-01The `env` object referenced from fibers may be freed; fix #4154Yukihiro "Matz" Matsumoto
By dffa203 that reclaim `env` objects from heaps, there's more chance for `env` objects referenced from fibers may be freed from heap pages.
2018-10-29Marking from terminated fibers are not needed; ref #4143Yukihiro "Matz" Matsumoto
The old condition marks the top-level callinfo even after the fiber is terminated.
2018-10-29Need to mark shared env objects as `MRB_TT_FREE`; fix #4143Yukihiro "Matz" Matsumoto
The following code mistakenly exits from the function without marking the env object as `MRB_TT_FREE`. ``` ruby if (MRB_ENV_STACK_SHARED_P(e)) { /* cannot be freed */ return; // <- should be `break` } ```
2018-09-07Clear terminated spacedearblue
2018-08-06irep is released when Fiber is terminatedpyama86
2018-08-01Remove `nregs` member from `mrb_callinfo`.Yukihiro "Matz" Matsumoto
This means reducing one word per a call frame.
2018-07-31Reorganize flags values for classes; fix #3975Yukihiro "Matz" Matsumoto
Renamed flag macro names as well: `MRB_FLAG_IS_FROZEN` -> `MRB_FL_OBJ_FROZEN` `MRB_FLAG_IS_PREPENDED` -> `MRB_FL_CLASS_IS_PREPENDED` `MRB_FLAG_IS_ORIGIN` -> `MRB_FL_CLASS_IS_ORIGIN` `MRB_FLAG_IS_INHERITED` -> `MRB_FL_CLASS_IS_INHERITED`
2018-04-26Fix wrong the number of marked objects of MRB_TT_ENV in gray mark phaseKouhei Sutou
If MRB_TT_ENV has stack shared flag or bidx flag, flags is too large than the real stack size.
2018-04-18Turn off major GC mode before full GC; fix #4000Yukihiro "Matz" Matsumoto
2018-04-14Invoke full GC when too many objects allocated during GC; fix #3998Yukihiro "Matz" Matsumoto
When object allocation rate during incremental GC is too high, the `gc->majorgc_old_threshold` becomes too big. This means major GC start slower and old objects stay longer (and consume too much memory).
2018-04-14Change `MAJOR_GC_INC_RATIO` to 120; ref #3998Yukihiro "Matz" Matsumoto
Because 200% is consumes too much memory for some cases.
2018-04-14Remove `DEFAULT_` from `DEFAULT_MAJOR_GC_INC_RATIO`; ref #3998Yukihiro "Matz" Matsumoto
Because unlike other GC ratio constants, it's not a default value.
2018-02-02Fix possible memory access error.Takeshi Watanabe
2017-11-29Need to free contexts when freeing fibers.Yukihiro "Matz" Matsumoto
Memory leak fixed; ref #3711
2017-11-22Should have marked all ensure stack entries; fix #3855 fix #3856Yukihiro "Matz" Matsumoto
2017-11-19Invoke `mrb_full_gc()` before `ObjectSpace.count_objects`.Yukihiro "Matz" Matsumoto
2017-11-04Merge branch 'master' of github.com:mruby/mrubyYAMAMOTO Masaya
2017-10-31Need to mark fibers referenced from `env`; fix #3837Yukihiro "Matz" Matsumoto
The issue #3837 is a regression of #3819. I was mistakenly removed a important code to mark fibers from `env`.
2017-10-28Heavily refactored how lexical scope links are implemented; fix #3821Yukihiro "Matz" Matsumoto
Instead of `irep` links, we added a `upper` link to `struct RProc`. To make a space for the `upper` link, we moved `target_class` reference. If a `Proc` does not have `env`, `target_class` is saved in an `union` shared with `env` (if a `Proc` has env, you can tell it by `MRB_PROC_ENV_P()). Otherwise `target_class` is referenced from `env->c`. We removed links in `env` as well. This change removes 2 members from `mrb_irep` struct, thus saving 2 words per method/proc/block. This also fixes potential memory leaks due to the circular references caused by a link from `mrb_irep`.
2017-10-11Add MRB_WITHOUT_FLOATYAMAMOTO Masaya
2017-10-11Use division expression instead of some floating point literalsYAMAMOTO Masaya
2017-10-01Add new type of shared string: `RSTR_FSHARED`.Yukihiro "Matz" Matsumoto
`RSTR_FSHARED` use frozen strings as shared body instead of `struct mrb_shared_string`. This reduces allocation from literal strings.
2017-09-29Cut links from `irep` in heaps finalization.Yukihiro "Matz" Matsumoto
2017-09-27fix: src\gc.c(1425): warning C4244: '=': conversion from 'mrb_int' to 'int', ↵Tomasz Dąbrowski
possible loss of data
2017-09-27fix: src\gc.c(1392): warning C4244: '=': conversion from 'mrb_int' to 'int', ↵Tomasz Dąbrowski
possible loss of data
2017-09-27fix: src\gc.c(559): warning C4244: '=': conversion from 'mrb_int' to 'int', ↵Tomasz Dąbrowski
possible loss of data
2017-09-05Avoid recursion from `mark_context()`.Yukihiro "Matz" Matsumoto
2017-09-04Restructure `irep->outer` chain; fix #3804Yukihiro "Matz" Matsumoto
Instead of `irep -> proc` chain, we use `irep -> irep` chain to avoid GC bugs like #3804. We added `target_class` reference to `mrb_irep` struct. That means one more word consumption per `irep`.
2017-08-30Need to mark `mrb->range_class`; fix #3797Yukihiro "Matz" Matsumoto
2017-08-29Revert "Clear `irep->outer` when no `Proc` reference the `irep`; fix #3793"Yukihiro "Matz" Matsumoto
This reverts commit 15d48efa4bf6a6b999dab99720fb9fe3c4a06ef0.
2017-08-28Clear `irep->outer` when no `Proc` reference the `irep`; fix #3793Yukihiro "Matz" Matsumoto
2017-08-19Call `mrb_full_gc` before `gc_each_objects`; ref #3782Yukihiro "Matz" Matsumoto
Otherwise dead object may be seen from `#each_object`.
2017-08-05`proc->body.irep` may be NULL; fix #3761Yukihiro "Matz" Matsumoto
2017-08-01Implements `Module::nesting' (15.2.2.3.2); ref #600, #3200Yukihiro "Matz" Matsumoto
2017-07-27Embed small size array elements in the heap.Yukihiro "Matz" Matsumoto
It reduces the memory consumption and sometimes improve the performance as well. For example, the consumed memory size of `bench/bm_ao_render.rb` is reduced from 1.2GB to 1GB, and its total execution time become 18.795 sec from 22.229 sec.